Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.59 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. // declaram functia de conversie din baza 64 inapoi in binar
  12. byte* B64_DEC(char* intrare, unsigned int* dimensiune_iesire)
  13. {
  14. return NULL;
  15. }
  16.  
  17. // declaram functia de conversie din binar in baza 64
  18. char* B64_ENC(byte* intrare, unsigned int lungime)
  19. {
  20. // sa facem o bucla care merge pe sirul intrare din 3 in 3 pozitii, cat timp pozitia este mai
  21. // mica decat lungimea sirului
  22. for (int i = 0; i + 2 < lungime; i += 3)
  23. {
  24. byte primii_6 = intrare[i + 0] >> 2;
  25. byte ultimii_2 = intrare[i + 0] & 0b00000011;
  26.  
  27. byte primii_4 = intrare[i + 1] >> 4;
  28. byte ultimii_4 = intrare[i + 1] & 0b00001111;
  29.  
  30. byte primii_2 = intrare[i + 2] >> 6;
  31. byte ultimii_6 = intrare[i + 2] & 0b00111111;
  32.  
  33. byte prima_valoare = primii_6;
  34. byte a_doua_valoare = ultimii_2 << 4 | primii_4;
  35. byte a_treia_valoare = ultimii_4 << 2 | primii_2;
  36. byte a_patra_valoare = ultimii_6;
  37.  
  38. char prima_litera = tabel_b64[prima_valoare];
  39. char a_doua_litera = tabel_b64[a_doua_valoare];
  40. char a_treia_litera = tabel_b64[a_treia_valoare];
  41. char a_patra_litera = tabel_b64[a_patra_valoare];
  42.  
  43. printf("%c%c%c%c", prima_litera, a_doua_litera, a_treia_litera, a_patra_litera);
  44. }
  45.  
  46. if (lungime % 3 == 1)
  47. {
  48. intrare[lungime - 1]; // 3f ‭001111 11‬
  49. // ne-a ramas 1 byte. deci putem scoate inca 2 caractere B64
  50. // primii 6 biti reprezinta 1 caracter. ultimii 2 biti reprezinta
  51. // al doilea caracter
  52. char primii_6 = intrare[lungime - 1] >> 2;
  53. char ultimii_2 = intrare[lungime - 1] & 0b00000011;
  54. ultimii_2 = ultimii_2 << 4;
  55.  
  56. char penultima_litera = tabel_b64[primii_6];
  57. char ultima_litera = tabel_b64[ultimii_2];
  58.  
  59. printf("%c%c==", penultima_litera, ultima_litera);
  60. }
  61. else if (lungime % 3 == 2)
  62. {
  63. intrare[lungime - 2];
  64. intrare[lungime - 1];
  65. // luam primii 6 biti din penultimul byte. -> il indexam si aflam caracterul B64
  66. // luam ultimii 2 biti din penltimu byte, ii adunam cu primii 4 biti din ultimul byte ->
  67. // il indexam si aflam caracterul b64
  68. // luam ultimii 4 biti din ultimul byte, ii completam cu 2 biti de 0
  69. // -> indexam si aflam caracterul B64
  70.  
  71. byte primii_6 = intrare[lungime - 2] >> 2;
  72. byte ultimii_2 = intrare[lungime - 2] & 0b00000011;
  73. byte primii_4 = intrare[lungime - 1] >> 4;
  74. byte ultimii_4 = intrare[lungime - 1] & 0b00001111;
  75.  
  76. char antepenultima_litera = tabel_b64[primii_6];
  77. char penultima_litera = tabel_b64[ultimii_2 << 4 | primii_4];
  78. char ultima_litera = tabel_b64[ultimii_4 << 2];
  79.  
  80.  
  81. printf("%c%c%c=", antepenultima_litera, penultima_litera, ultima_litera);
  82.  
  83.  
  84. }
  85.  
  86.  
  87. return NULL;
  88. }
  89.  
  90. // declaram o functie pentru testat functiile de conversie
  91. void test()
  92. {
  93. FILE* pFile;
  94. long lSize;
  95. byte* buffer;
  96. size_t result;
  97.  
  98. fopen_s(&pFile,"E:/games/Diablo III/x64/Diablo III64.exe", "rb");
  99. if (pFile == NULL) { fputs("File error", stderr); exit(1); }
  100.  
  101. // obtain file size:
  102. fseek(pFile, 0, SEEK_END);
  103. lSize = ftell(pFile);
  104. rewind(pFile);
  105.  
  106. // allocate memory to contain the whole file:
  107. buffer = (byte*)malloc(sizeof(byte) * lSize);
  108. if (buffer == NULL) { fputs("Memory error", stderr); exit(2); }
  109.  
  110. // copy the file into the buffer:
  111. result = fread(buffer, 1, lSize, pFile);
  112. if (result != lSize) { fputs("Reading error", stderr); exit(3); }
  113.  
  114. B64_ENC(buffer, lSize);
  115. }
  116. int main(int argc, char** argv)
  117. {
  118. test();
  119.  
  120. char c;
  121. scanf_s("%c", &c);
  122.  
  123. return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement