[Add] Comments to base64.

This commit is contained in:
Allanis 2013-05-23 21:30:49 +01:00
parent a064eec5eb
commit 97baac1c3e

View File

@ -2,9 +2,9 @@
#include <string.h> #include <string.h>
#include <stdint.h> #include <stdint.h>
// Encode table. // Encode table - base64 alphabet is defined by the rfc
static const char cb64[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char cb64[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
// Decode table. // Generate decode table at compile time.
#define B64(_) \ #define B64(_) \
((_) == 'A' ? 0 \ ((_) == 'A' ? 0 \
: (_) == 'B' ? 1 \ : (_) == 'B' ? 1 \
@ -72,6 +72,7 @@ static const char cb64[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx
: (_) == '/' ? 63 \ : (_) == '/' ? 63 \
: -1) : -1)
// Makes it much faster.
static const signed char cd64[256] = { static const signed char cd64[256] = {
B64(0), B64(1), B64(2), B64(3), B64(0), B64(1), B64(2), B64(3),
B64(4), B64(5), B64(6), B64(7), B64(4), B64(5), B64(6), B64(7),
@ -180,6 +181,7 @@ char* base64_encode(size_t* len, char* src, size_t sz) {
for(c = 0; c < pad; c++) for(c = 0; c < pad; c++)
r[i-c-1] = '='; r[i-c-1] = '=';
// It'll be a valid string.
r[i] = '\0'; r[i] = '\0';
(*len) = i; (*len) = i;
@ -212,19 +214,23 @@ char* base64_decode(size_t* len, char* src, size_t sz) {
j = 0; j = 0;
for(i = 0; i < sz; i++) { for(i = 0; i < sz; i++) {
if(src[i] == '=') if(src[i] == '=')
// Control padding.
pad++; pad++;
if(dec_valid(src[i])) if(dec_valid(src[i]))
// Only allow valid characters.
dat[j++] = src[i]; dat[j++] = src[i];
} }
// Fill r. // Fill r.
i = 0; i = 0;
for(c = 0; c < j; c += 4) { for(c = 0; c < j; c += 4) {
n = dec_ch(dat[c+0]) << 18; // Process the input from base 64.
n += (c+1<j) ? (dec_ch(dat[c+1]) << 12) : 0; n = dec_ch(dat[c+0]) << 18; // Guaranteed to be valid.
n += (c+1<j) ? (dec_ch(dat[c+1]) << 12) : 0; // Check if in bounds.
n += (c+2<j) ? (dec_ch(dat[c+2]) << 6) : 0; n += (c+2<j) ? (dec_ch(dat[c+2]) << 6) : 0;
n += (c+3<j) ? (dec_ch(dat[c+3]) << 0) : 0; n += (c+3<j) ? (dec_ch(dat[c+3]) << 0) : 0;
// Convert the 24 bits of encoded data into 3 8 bit chunks.
r[i++] = (n >> 16) & 255; r[i++] = (n >> 16) & 255;
r[i++] = (n >> 8) & 255; r[i++] = (n >> 8) & 255;
r[i++] = (n >> 0) & 255; r[i++] = (n >> 0) & 255;
@ -234,7 +240,7 @@ char* base64_decode(size_t* len, char* src, size_t sz) {
// Cleanup. // Cleanup.
free(dat); free(dat);
(*len) = i - pad; (*len) = i - pad; // Must decount the padding.
return r; return r;
} }