Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- #include <stdlib.h>
- // declaram tipul "byte"
- typedef unsigned char byte;
- // declaram tabelul de corespondenta baza 64
- const char* tabel_b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- // declaram functia de conversie din baza 64 inapoi in binar
- byte* B64_DEC(byte* intrare, size_t lungime_intrare, unsigned int* dimensiune_iesire, char* nume_fisier_de_iesire)
- {
- *dimensiune_iesire = 12;
- return NULL;
- }
- // declaram functia de conversie din binar in baza 64
- char* B64_ENC(byte* intrare, unsigned int lungime, char* nume_fisier_de_iesire)
- {
- // deschidem fisierul de iesire
- FILE* fisier_de_iesire;
- fopen_s(&fisier_de_iesire, nume_fisier_de_iesire, "w");
- // sa facem o bucla care merge pe sirul intrare din 3 in 3 pozitii, cat timp pozitia este mai
- // mica decat lungimea sirului
- for (int i = 0; i + 2 < lungime; i += 3)
- {
- byte primii_6 = intrare[i + 0] >> 2;
- byte ultimii_2 = intrare[i + 0] & 0b00000011;
- byte primii_4 = intrare[i + 1] >> 4;
- byte ultimii_4 = intrare[i + 1] & 0b00001111;
- byte primii_2 = intrare[i + 2] >> 6;
- byte ultimii_6 = intrare[i + 2] & 0b00111111;
- byte prima_valoare = primii_6;
- byte a_doua_valoare = ultimii_2 << 4 | primii_4;
- byte a_treia_valoare = ultimii_4 << 2 | primii_2;
- byte a_patra_valoare = ultimii_6;
- char prima_litera = tabel_b64[prima_valoare];
- char a_doua_litera = tabel_b64[a_doua_valoare];
- char a_treia_litera = tabel_b64[a_treia_valoare];
- char a_patra_litera = tabel_b64[a_patra_valoare];
- fprintf(fisier_de_iesire,"%c%c%c%c", prima_litera, a_doua_litera, a_treia_litera, a_patra_litera);
- }
- if (lungime % 3 == 1)
- {
- intrare[lungime - 1]; // 3f 001111 11
- // ne-a ramas 1 byte. deci putem scoate inca 2 caractere B64
- // primii 6 biti reprezinta 1 caracter. ultimii 2 biti reprezinta
- // al doilea caracter
- char primii_6 = intrare[lungime - 1] >> 2;
- char ultimii_2 = intrare[lungime - 1] & 0b00000011;
- ultimii_2 = ultimii_2 << 4;
- char penultima_litera = tabel_b64[primii_6];
- char ultima_litera = tabel_b64[ultimii_2];
- fprintf(fisier_de_iesire, "%c%c==", penultima_litera, ultima_litera);
- }
- else if (lungime % 3 == 2)
- {
- intrare[lungime - 2];
- intrare[lungime - 1];
- // luam primii 6 biti din penultimul byte. -> il indexam si aflam caracterul B64
- // luam ultimii 2 biti din penltimu byte, ii adunam cu primii 4 biti din ultimul byte ->
- // il indexam si aflam caracterul b64
- // luam ultimii 4 biti din ultimul byte, ii completam cu 2 biti de 0
- // -> indexam si aflam caracterul B64
- byte primii_6 = intrare[lungime - 2] >> 2;
- byte ultimii_2 = intrare[lungime - 2] & 0b00000011;
- byte primii_4 = intrare[lungime - 1] >> 4;
- byte ultimii_4 = intrare[lungime - 1] & 0b00001111;
- char antepenultima_litera = tabel_b64[primii_6];
- char penultima_litera = tabel_b64[ultimii_2 << 4 | primii_4];
- char ultima_litera = tabel_b64[ultimii_4 << 2];
- fprintf(fisier_de_iesire,"%c%c%c=", antepenultima_litera, penultima_litera, ultima_litera);
- }
- return NULL;
- }
- size_t citeste_fisier(char* nume_fisier, byte** continut)
- {
- // citire fisier
- FILE* pFile;
- long lSize;
- byte* buffer;
- size_t result;
- fopen_s(&pFile, nume_fisier, "rb");
- if (pFile == NULL)
- {
- fputs("File error", stderr);
- exit(1);
- }
- // obtain file size:
- fseek(pFile, 0, SEEK_END);
- lSize = ftell(pFile);
- rewind(pFile);
- // allocate memory to contain the whole file:
- *continut = (byte*)malloc(sizeof(byte) * lSize);
- if (*continut == NULL) { fputs("Memory error", stderr); exit(2); }
- // copy the file into the buffer:
- result = fread(*continut, 1, lSize, pFile);
- if (result != lSize) { fputs("Reading error", stderr); exit(3); }
- return lSize;
- }
- int main(int argc, char** argv)
- {
- //initializare_tabel();
- // verificam daca argc e diferit de 2
- if (argc < 2)
- {
- // tiparim o eroare
- printf("Numar incorect de argumente!");
- // iesim din program
- return 0;
- }
- for (int i = 0; i < argc; i++)
- {
- printf("al %d-lea parametru: %s\n",i, argv[i]);
- }
- byte* continut_fisier = NULL;
- size_t lungime_fisier = citeste_fisier(argv[1], &continut_fisier);
- B64_ENC(continut_fisier, lungime_fisier,argv[2]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement