base64编码与解码
2013-09-16 17:10
288 查看
2.解码
参考1:
// 从 data 还原 base64编码,解码的结果保存到 buffer
static void
decode_base64(uint8_t *buffer, uint16_t len, uint8_t *data)
{
uint8_t *bp = buffer; // bp 指向最近解出的码可以存放的位置
uint8_t *p = data; // p 指向 一组编码(四个) 的开头
uint8_t c1, c2, c3, c4; // 每次从 data 里获得 4 个编码存到c1 ~ c4
while (bp < buffer + len) { // 可保存解码的位置还没有超出缓冲区
c1 = CHAR64(*p); // 假设读取了 00aaaaaa 到 c1 (a表示 1 或 0)
c2 = CHAR64(*(p + 1)); // 假设读取了 00aabbbb 到 c2 (b表示 1 或 0)
if (c1 == 255 || c2 == 255)
break; // 如果遇到编码结束符 == 255 就退出解码过程
// 八位的c1左移两位,头六位成为解码的头部
// 用(00110000)截取八位的c2前半字节的后两位,右移四位,成为解码的尾部
*bp++ = (c1 << 2) | ((c2 & 0x30) >> 4); // (aaaaaa00) | (000000aa)
if (bp >= buffer + len)
break; // 如果超出缓冲区,就退出本次解码过程
c3 = CHAR64(*(p + 2)); // 假设读取了 00bbbbcc 到 c3 (b 或 c 表示 1 或 0)
if (c3 == 255)
break; // 如果遇到编码结束符 == 255 就退出解码过程
// 用(00001111)截取八位的c2后半字节,左移四位,成为解码的头部
// 用(00111100)截取八位的c3中间四位,右移两位,成为解码的尾部
*bp++ = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2); // (bbbb0000) | (0000bbbb)
if (bp >= buffer + len)
break; // 如果超出缓冲区,就退出本次解码过程
c4 = CHAR64(*(p + 3)); // 假设读取了 00cccccc 到 c4 (c 表示 1 或 0)
if (c4 == 255)
break; // 如果遇到编码结束符 == 255 就退出解码过程
// 用(00000011)截取八位的c3中最后两位,左移六位,成为解码的头部
// c4中最后六位,成为解码的尾部
*bp++ = ((c3 & 0x03) << 6) | c4; // (cc000000) | (00cccccc)
p += 4; // p 移动到 下一组(四个) 编码的开头
}
}
----------------------
参考2:
char *b64index = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
bool Base64Decode(char *code, char *txt)
{
int len = strlen(code);
if(len % 4) return false;
char *buf = new char[len];
int i,j;
bool p = false;
for(i = 0; i < len; i++)
{
p = false;
for(j = 0; j < 64; j++)
{
if(code[i] == b64index[j] || code[i] == '=')
{
buf[i] = j;
p = true;
break;
}
}
if(!p)
return false; //出现非法字符
}
if(code[len - 1] == '=') buf[len - 1] = 0;
if(code[len - 2] == '=') buf[len - 2] = 0;
for(i = 0; i < len / 4; i++)
{
txt[i * 3] = buf[i * 4] << 2 & 0xFC | ( buf[i * 4 + 1] >> 4 & 0x03);
txt[i * 3 + 1] = buf[i * 4 + 1] << 4 & 0xF0 | ( buf[i * 4 + 2] >> 2 & 0x0F);
txt[i * 3 + 2] = buf[i * 4 + 2] << 6 & 0xC0 | buf[i * 4 + 3];
}
txt[len * 6 / 8] = '\0';
delete buf;
return true;
}
--------------------------------
参考3:
引用自:http://my.csdn.net/cclongying1989/code/detail/13009
ascii码表:http://baike.baidu.com/view/15482.htm?fromId=812
参考1:
// 从 data 还原 base64编码,解码的结果保存到 buffer
static void
decode_base64(uint8_t *buffer, uint16_t len, uint8_t *data)
{
uint8_t *bp = buffer; // bp 指向最近解出的码可以存放的位置
uint8_t *p = data; // p 指向 一组编码(四个) 的开头
uint8_t c1, c2, c3, c4; // 每次从 data 里获得 4 个编码存到c1 ~ c4
while (bp < buffer + len) { // 可保存解码的位置还没有超出缓冲区
c1 = CHAR64(*p); // 假设读取了 00aaaaaa 到 c1 (a表示 1 或 0)
c2 = CHAR64(*(p + 1)); // 假设读取了 00aabbbb 到 c2 (b表示 1 或 0)
if (c1 == 255 || c2 == 255)
break; // 如果遇到编码结束符 == 255 就退出解码过程
// 八位的c1左移两位,头六位成为解码的头部
// 用(00110000)截取八位的c2前半字节的后两位,右移四位,成为解码的尾部
*bp++ = (c1 << 2) | ((c2 & 0x30) >> 4); // (aaaaaa00) | (000000aa)
if (bp >= buffer + len)
break; // 如果超出缓冲区,就退出本次解码过程
c3 = CHAR64(*(p + 2)); // 假设读取了 00bbbbcc 到 c3 (b 或 c 表示 1 或 0)
if (c3 == 255)
break; // 如果遇到编码结束符 == 255 就退出解码过程
// 用(00001111)截取八位的c2后半字节,左移四位,成为解码的头部
// 用(00111100)截取八位的c3中间四位,右移两位,成为解码的尾部
*bp++ = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2); // (bbbb0000) | (0000bbbb)
if (bp >= buffer + len)
break; // 如果超出缓冲区,就退出本次解码过程
c4 = CHAR64(*(p + 3)); // 假设读取了 00cccccc 到 c4 (c 表示 1 或 0)
if (c4 == 255)
break; // 如果遇到编码结束符 == 255 就退出解码过程
// 用(00000011)截取八位的c3中最后两位,左移六位,成为解码的头部
// c4中最后六位,成为解码的尾部
*bp++ = ((c3 & 0x03) << 6) | c4; // (cc000000) | (00cccccc)
p += 4; // p 移动到 下一组(四个) 编码的开头
}
}
----------------------
参考2:
char *b64index = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
bool Base64Decode(char *code, char *txt)
{
int len = strlen(code);
if(len % 4) return false;
char *buf = new char[len];
int i,j;
bool p = false;
for(i = 0; i < len; i++)
{
p = false;
for(j = 0; j < 64; j++)
{
if(code[i] == b64index[j] || code[i] == '=')
{
buf[i] = j;
p = true;
break;
}
}
if(!p)
return false; //出现非法字符
}
if(code[len - 1] == '=') buf[len - 1] = 0;
if(code[len - 2] == '=') buf[len - 2] = 0;
for(i = 0; i < len / 4; i++)
{
txt[i * 3] = buf[i * 4] << 2 & 0xFC | ( buf[i * 4 + 1] >> 4 & 0x03);
txt[i * 3 + 1] = buf[i * 4 + 1] << 4 & 0xF0 | ( buf[i * 4 + 2] >> 2 & 0x0F);
txt[i * 3 + 2] = buf[i * 4 + 2] << 6 & 0xC0 | buf[i * 4 + 3];
}
txt[len * 6 / 8] = '\0';
delete buf;
return true;
}
--------------------------------
参考3:
引用自:http://my.csdn.net/cclongying1989/code/detail/13009
ascii码表:http://baike.baidu.com/view/15482.htm?fromId=812
相关文章推荐
- base64编码、解码的C语言实现
- Base64编码解码〔源代码〕
- php使用base64_encode和base64_decode对数据进行编码和解码
- C#实现Base64编码与解码(一)
- Android图片的Base64编码与解码及解码Base64图片方法
- JavaScript实现的Base64编码和解码
- javascript实现的base64编码解码
- 利用base64对图片进行编码及解码
- 如何在javascript里使用base64得编码和解码
- BASE64编码和解码
- JavaScript Base64编码和解码,实现URL参数传递。
- PHP安全的URL字符串base64编码和解码
- C#解码base64编码二进制数据的方法
- Base64编码解码过程中中文乱码问题
- Python加密—Base64编码解码
- 利用openssl进行base64的编码与解码
- C#实现Base64编码与解码
- JS 实现Base64编码与解码实例详解
- android Java BASE64编码和解码一:基础
- base64编码、解码的C语言实现