#include <stdio.h>
#include <string.h>
void base64Encode(char *text, size_t length, char *reslut);
void base64Decode(char *text, size_t length, char *result);
const char encodeMap[] = {
'A','B','C','D','E','F','G',
'H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U',
'V','W','X','Y','Z',
'a','b','c','d','e','f','g',
'h','i','j','k','l','m','n',
'o','p','q','r','s','t','u',
'v','w','x','y','z',
'0','1','2','3','4','5','6','7','8','9',
'+','/'
};
const char decodeMap[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,63,
52,53,54,55,56,57,58,59,60,61,0,0,0,0,0,0,
0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,
15,16,17,18,19,20,21,22,23,24,25,0,0,0,0,0,
0,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49,50,51,0,0,0,0,0
};
int main(void) {
char testText[] = "ABCDEFG";
char encodedText[1024];
base64Encode
(testText
, strlen(testText
), encodedText
); printf("encoded:%s\n", encodedText
);
char decodedText[1024];
base64Decode
(encodedText
, strlen(encodedText
), decodedText
); printf("decoded:%s\n", decodedText
);
return 0;
}
void base64Encode(char *text, size_t length, char *result) {
int i;
for (i = 0; i < length; i += 3) {
result[(i / 3) * 4] = encodeMap[text[i] >> 2 & 0x3F];
result[(i / 3) * 4 + 1] = encodeMap[text[i] << 4 & 0x30 | text[i + 1] >> 4 & 0x0F];
result[(i / 3) * 4 + 2] = encodeMap[text[i + 1] << 2 & 0x3C | text[i + 2] >> 6 & 0x03];
result[(i / 3) * 4 + 3] = encodeMap[text[i + 2] & 0x3F];
}
if (length % 3 == 1)
result[((length - 1) / 3 + 1) * 4 - 2] = '=';
if (length % 3 == 1 || length % 3 == 2)
result[((length - 1) / 3 + 1) * 4 - 1] = '=';
result[((length - 1) / 3 + 1) * 4] = '\0';
}
void base64Decode(char *text, size_t length, char *result) {
int i;
for (i = 0; i < length; i += 4) {
result[(i / 4) * 3] = decodeMap[text[i]] << 2 & 0xFC | decodeMap[text[i + 1]] >> 4 & 0x03;
result[(i / 4) * 3 + 1] = decodeMap[text[i + 1]] << 4 & 0xF0 | decodeMap[text[i + 2]] >> 2 & 0x0F;
result[(i / 4) * 3 + 2] = decodeMap[text[i + 2]] << 6 & 0xC0 | decodeMap[text[i + 3]] & 0x3F;
}
result[((length - 1) / 4 + 1) * 3] = '\0';
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCnZvaWQgYmFzZTY0RW5jb2RlKGNoYXIgKnRleHQsIHNpemVfdCBsZW5ndGgsIGNoYXIgKnJlc2x1dCk7CnZvaWQgYmFzZTY0RGVjb2RlKGNoYXIgKnRleHQsIHNpemVfdCBsZW5ndGgsIGNoYXIgKnJlc3VsdCk7Cgpjb25zdCBjaGFyIGVuY29kZU1hcFtdID0gewoJJ0EnLCdCJywnQycsJ0QnLCdFJywnRicsJ0cnLAoJJ0gnLCdJJywnSicsJ0snLCdMJywnTScsJ04nLAoJJ08nLCdQJywnUScsJ1InLCdTJywnVCcsJ1UnLAoJJ1YnLCdXJywnWCcsJ1knLCdaJywKCSdhJywnYicsJ2MnLCdkJywnZScsJ2YnLCdnJywKCSdoJywnaScsJ2onLCdrJywnbCcsJ20nLCduJywKCSdvJywncCcsJ3EnLCdyJywncycsJ3QnLCd1JywKCSd2JywndycsJ3gnLCd5JywneicsCgknMCcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsCgknKycsJy8nCn07CmNvbnN0IGNoYXIgZGVjb2RlTWFwW10gPSB7CgkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCw2MiwwLDAsMCw2MywKCTUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDAsMCwwLDAsMCwwLAoJMCwwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LAoJMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMCwwLDAsMCwwLAoJMCwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCwKCTQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDAsMCwwLDAsMAp9OwoKaW50IG1haW4odm9pZCkgewoJY2hhciB0ZXN0VGV4dFtdID0gIkFCQ0RFRkciOwoKCWNoYXIgZW5jb2RlZFRleHRbMTAyNF07CgliYXNlNjRFbmNvZGUodGVzdFRleHQsIHN0cmxlbih0ZXN0VGV4dCksIGVuY29kZWRUZXh0KTsKCXByaW50ZigiZW5jb2RlZDolc1xuIiwgZW5jb2RlZFRleHQpOwoKCgljaGFyIGRlY29kZWRUZXh0WzEwMjRdOwoJYmFzZTY0RGVjb2RlKGVuY29kZWRUZXh0LCBzdHJsZW4oZW5jb2RlZFRleHQpLCBkZWNvZGVkVGV4dCk7CglwcmludGYoImRlY29kZWQ6JXNcbiIsIGRlY29kZWRUZXh0KTsKCglyZXR1cm4gMDsKfQoKdm9pZCBiYXNlNjRFbmNvZGUoY2hhciAqdGV4dCwgc2l6ZV90IGxlbmd0aCwgY2hhciAqcmVzdWx0KSB7CglpbnQgaTsKCglmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDMpIHsKCQlyZXN1bHRbKGkgLyAzKSAqIDRdID0gZW5jb2RlTWFwW3RleHRbaV0gPj4gMiAmIDB4M0ZdOwoJCXJlc3VsdFsoaSAvIDMpICogNCArIDFdID0gZW5jb2RlTWFwW3RleHRbaV0gPDwgNCAmIDB4MzAgfCB0ZXh0W2kgKyAxXSA+PiA0ICYgMHgwRl07CgkJcmVzdWx0WyhpIC8gMykgKiA0ICsgMl0gPSBlbmNvZGVNYXBbdGV4dFtpICsgMV0gPDwgMiAmIDB4M0MgfCB0ZXh0W2kgKyAyXSA+PiA2ICYgMHgwM107CgkJcmVzdWx0WyhpIC8gMykgKiA0ICsgM10gPSBlbmNvZGVNYXBbdGV4dFtpICsgMl0gJiAweDNGXTsKCX0KCglpZiAobGVuZ3RoICUgMyA9PSAxKSAKCQlyZXN1bHRbKChsZW5ndGggLSAxKSAvIDMgKyAxKSAqIDQgLSAyXSA9ICc9JzsKCWlmIChsZW5ndGggJSAzID09IDEgfHwgbGVuZ3RoICUgMyA9PSAyKSAKCQlyZXN1bHRbKChsZW5ndGggLSAxKSAvIDMgKyAxKSAqIDQgLSAxXSA9ICc9JzsKCglyZXN1bHRbKChsZW5ndGggLSAxKSAvIDMgKyAxKSAqIDRdID0gJ1wwJzsKfQoKdm9pZCBiYXNlNjREZWNvZGUoY2hhciAqdGV4dCwgc2l6ZV90IGxlbmd0aCwgY2hhciAqcmVzdWx0KSB7CglpbnQgaTsKCglmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKCQlyZXN1bHRbKGkgLyA0KSAqIDNdID0gZGVjb2RlTWFwW3RleHRbaV1dIDw8IDIgJiAweEZDIHwgZGVjb2RlTWFwW3RleHRbaSArIDFdXSA+PiA0ICYgMHgwMzsKCQlyZXN1bHRbKGkgLyA0KSAqIDMgKyAxXSA9IGRlY29kZU1hcFt0ZXh0W2kgKyAxXV0gPDwgNCAmIDB4RjAgfCBkZWNvZGVNYXBbdGV4dFtpICsgMl1dID4+IDIgJiAweDBGOwoJCXJlc3VsdFsoaSAvIDQpICogMyArIDJdID0gZGVjb2RlTWFwW3RleHRbaSArIDJdXSA8PCA2ICYgMHhDMCB8IGRlY29kZU1hcFt0ZXh0W2kgKyAzXV0gJiAweDNGOwoJfQoKCXJlc3VsdFsoKGxlbmd0aCAtIDEpIC8gNCArIDEpICogM10gPSAnXDAnOwp9