Base64
-- Sebastian Pawlak, 2004.
Kod źródłowy pliku "base64.h":
/* base64: biblioteka funkcji pozwalajacych na konwersje lancucha bajtow * do base64 i na odwrot * * Sebastian Pawlak, 2004-07-03. */ #ifndef _BASE64_H_ #define _BASE64_H_ void encodeBase64(const unsigned char *s, char *t, int len); void decodeBase64(const char *s, unsigned char *t); #endif
Kod źródłowy pliku "base64.c":
/* base64: biblioteka funkcji pozwalajacych na konwersje lancucha bajtow * do base64 i na odwrot * * Sebastian Pawlak, 2004-07-03. */ #include <string.h> const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789" "+/"; /* encodeBlock: koduje blok trzech bajtow na cztery znaki wg. tablicy base64 */ void encodeBlock(const unsigned char in[3], char out[4], int len) { out[0] = base64[in[0] >> 2]; out[1] = base64[((in[0] & 0x03) << 4) | (in[1] >> 4)]; out[2] = (len > 1) ? (base64[((in[1] & 0x0f) << 2) | (in[2] >> 6)]) : '='; out[3] = (len > 2) ? (base64[in[2] & 0x3f]) : '='; } /* encodeBase64: koduje zadany lancuch bajtow do base64 */ void encodeBase64(const unsigned char *s, char *t, int len) { int i; for (i = 0; i < len / 3; i++) encodeBlock(&s[i * 3], &t[i * 4], 3); if (len - i * 3 > 0) { encodeBlock(&s[i * 3], &t[i * 4], len - i * 3); i++; } t[i * 4] = '\0'; } /* decodeBlock: odkodowuje blok czterech znakow w base64 na trzy bajty */ void decodeBlock(const char in[4], unsigned char out[3]) { char inTmp[4] = { 0 }; int i; char *p; for (i = 0; i < 4; i++) if ((p = strchr(base64, in[i])) != NULL) inTmp[i] = p - base64; out[0] = (inTmp[0] << 2) | (inTmp[1] >> 4); out[1] = (inTmp[1] << 4) | (inTmp[2] >> 2); if (out[1] == '\0') return; out[2] = (inTmp[2] << 6) | (inTmp[3]); } /* decodeBase64: odkodowuje zadany lancuch znakow w base64; * napotkanie blednego bajtu, konczy odkodowywanie; * dlugosc wejsciowego lancucha znakow musi dzielic sie przez 4 */ void decodeBase64(const char *s, unsigned char *t) { int i; for (i = 0; i < strlen(s) / 4; i++) decodeBlock(&s[i * 4], &t[i * 3]); if (s[i * 4 - 1] != '=') t[i * 3] = '\0'; }
Kod źródłowy pliku "test.c":
/* test.c: ilustracja dzialania funkcji Base64 * Sebastian Pawlak, 2004-07-03 */ #include <stdio.h> #include <string.h> #include "base64.h" int main(void) { char t[] = "ala ma kota"; char w[64], q[64]; fprintf(stdout, "oryginalny: %s\n", t); encodeBase64(t, w, strlen(t)); fprintf(stdout, "zakodowany: %s\n", w); decodeBase64(w, q); fprintf(stdout, "odkodowany: %s\n", q); return 0; }