Advertisement
Guest User

Untitled

a guest
Dec 16th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.27 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4.  
  5. // declaram tipul "byte"
  6. typedef unsigned char byte;
  7.  
  8. // declaram tabelul de corespondenta baza 64
  9. const char* tabel_b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  10.  
  11.  
  12. // declaram functia de conversie din baza 64 inapoi in binar
  13. byte* B64_DEC(byte* intrare, size_t lungime_intrare, unsigned int* dimensiune_iesire, char* nume_fisier_de_iesire)
  14. {
  15. *dimensiune_iesire = 12;
  16. return NULL;
  17. }
  18.  
  19. // declaram functia de conversie din binar in baza 64
  20. char* B64_ENC(byte* intrare, unsigned int lungime, char* nume_fisier_de_iesire)
  21. {
  22. // deschidem fisierul de iesire
  23. FILE* fisier_de_iesire;
  24. fopen_s(&fisier_de_iesire, nume_fisier_de_iesire, "w");
  25.  
  26.  
  27. // sa facem o bucla care merge pe sirul intrare din 3 in 3 pozitii, cat timp pozitia este mai
  28. // mica decat lungimea sirului
  29. for (int i = 0; i + 2 < lungime; i += 3)
  30. {
  31. byte primii_6 = intrare[i + 0] >> 2;
  32. byte ultimii_2 = intrare[i + 0] & 0b00000011;
  33.  
  34. byte primii_4 = intrare[i + 1] >> 4;
  35. byte ultimii_4 = intrare[i + 1] & 0b00001111;
  36.  
  37. byte primii_2 = intrare[i + 2] >> 6;
  38. byte ultimii_6 = intrare[i + 2] & 0b00111111;
  39.  
  40. byte prima_valoare = primii_6;
  41. byte a_doua_valoare = ultimii_2 << 4 | primii_4;
  42. byte a_treia_valoare = ultimii_4 << 2 | primii_2;
  43. byte a_patra_valoare = ultimii_6;
  44.  
  45. char prima_litera = tabel_b64[prima_valoare];
  46. char a_doua_litera = tabel_b64[a_doua_valoare];
  47. char a_treia_litera = tabel_b64[a_treia_valoare];
  48. char a_patra_litera = tabel_b64[a_patra_valoare];
  49.  
  50. fprintf(fisier_de_iesire,"%c%c%c%c", prima_litera, a_doua_litera, a_treia_litera, a_patra_litera);
  51. }
  52.  
  53. if (lungime % 3 == 1)
  54. {
  55. intrare[lungime - 1]; // 3f ‭001111 11‬
  56. // ne-a ramas 1 byte. deci putem scoate inca 2 caractere B64
  57. // primii 6 biti reprezinta 1 caracter. ultimii 2 biti reprezinta
  58. // al doilea caracter
  59. char primii_6 = intrare[lungime - 1] >> 2;
  60. char ultimii_2 = intrare[lungime - 1] & 0b00000011;
  61. ultimii_2 = ultimii_2 << 4;
  62.  
  63. char penultima_litera = tabel_b64[primii_6];
  64. char ultima_litera = tabel_b64[ultimii_2];
  65.  
  66. fprintf(fisier_de_iesire, "%c%c==", penultima_litera, ultima_litera);
  67. }
  68. else if (lungime % 3 == 2)
  69. {
  70. intrare[lungime - 2];
  71. intrare[lungime - 1];
  72. // luam primii 6 biti din penultimul byte. -> il indexam si aflam caracterul B64
  73. // luam ultimii 2 biti din penltimu byte, ii adunam cu primii 4 biti din ultimul byte ->
  74. // il indexam si aflam caracterul b64
  75. // luam ultimii 4 biti din ultimul byte, ii completam cu 2 biti de 0
  76. // -> indexam si aflam caracterul B64
  77.  
  78. byte primii_6 = intrare[lungime - 2] >> 2;
  79. byte ultimii_2 = intrare[lungime - 2] & 0b00000011;
  80. byte primii_4 = intrare[lungime - 1] >> 4;
  81. byte ultimii_4 = intrare[lungime - 1] & 0b00001111;
  82.  
  83. char antepenultima_litera = tabel_b64[primii_6];
  84. char penultima_litera = tabel_b64[ultimii_2 << 4 | primii_4];
  85. char ultima_litera = tabel_b64[ultimii_4 << 2];
  86.  
  87.  
  88. fprintf(fisier_de_iesire,"%c%c%c=", antepenultima_litera, penultima_litera, ultima_litera);
  89.  
  90.  
  91. }
  92.  
  93.  
  94. return NULL;
  95. }
  96. size_t citeste_fisier(char* nume_fisier, byte** continut)
  97. {
  98. // citire fisier
  99. FILE* pFile;
  100. long lSize;
  101. byte* buffer;
  102. size_t result;
  103.  
  104.  
  105.  
  106. fopen_s(&pFile, nume_fisier, "rb");
  107. if (pFile == NULL)
  108. {
  109. fputs("File error", stderr);
  110. exit(1);
  111. }
  112.  
  113. // obtain file size:
  114. fseek(pFile, 0, SEEK_END);
  115. lSize = ftell(pFile);
  116. rewind(pFile);
  117.  
  118. // allocate memory to contain the whole file:
  119. *continut = (byte*)malloc(sizeof(byte) * lSize);
  120. if (*continut == NULL) { fputs("Memory error", stderr); exit(2); }
  121.  
  122. // copy the file into the buffer:
  123. result = fread(*continut, 1, lSize, pFile);
  124. if (result != lSize) { fputs("Reading error", stderr); exit(3); }
  125.  
  126. return lSize;
  127. }
  128.  
  129. int main(int argc, char** argv)
  130. {
  131. //initializare_tabel();
  132. // verificam daca argc e diferit de 2
  133. if (argc < 2)
  134. {
  135. // tiparim o eroare
  136. printf("Numar incorect de argumente!");
  137.  
  138. // iesim din program
  139. return 0;
  140. }
  141. for (int i = 0; i < argc; i++)
  142. {
  143. printf("al %d-lea parametru: %s\n",i, argv[i]);
  144. }
  145.  
  146.  
  147. byte* continut_fisier = NULL;
  148. size_t lungime_fisier = citeste_fisier(argv[1], &continut_fisier);
  149.  
  150. B64_ENC(continut_fisier, lungime_fisier,argv[2]);
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158. return 0;
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement