在C中解码base64编码的二进制字符串

时间:2011-07-15 22:15:25

标签: c base64 decoding

我正在努力让我的解码器代码正常工作。我正在使用wikipedia中的示例64位编码字符串,尝试重现他们编码的文本。

#include <stdio.h>

//Convert raw binary character to the cb64 index
unsigned char get_cb64(unsigned char c){
if(c>='A' && c<='Z'){return c-'A';}
if(c>='a' && c<='z'){return c-'G';}
if(c>='0' && c<='9'){return c+4;}
if(c=='+'){return '>';}
if(c=='/'){return '?';}
else{return 0;}
}

void main(int argc, char** argv)
{
unsigned char* str = "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=";

//convert each binary character to its cb64 index
int size = 360;
int num_bytes = 8;
unsigned char str_cb64[size + 1];
int cb64_idx;
int i;
for(i=0; i < size; i++){
    str_cb64[i]=get_cb64(str[i]);
}
str_cb64[size] = 0;

//convert blocks of 4 6 bit chars to 3 8 bit chars 
int end_size = size*6/8;
unsigned char ascii_out[end_size];
int out_idx = 0;
int in_idx = 0;
while(in_idx < end_size/4){
  ascii_out[out_idx]   = str_cb64[in_idx+0] << 2 | str_cb64[in_idx+1] >> 4;
  ascii_out[out_idx+1] = str_cb64[in_idx+1] << 4 | str_cb64[in_idx+2] >> 2;
  ascii_out[out_idx+2] = str_cb64[in_idx+2] << 6 | str_cb64[in_idx+3];
    out_idx += 3;
    in_idx += 4;
}   

for(i=0; i < end_size; i++){printf("%d\n",ascii_out[i]);}

}

要检查,这里的代码打印每个解码字符的ascii值,该值应该介于48和122之间,但是有来自(0,255)的值。我测试了从原始二进制到cb64索引的转换,这似乎工作正常。问题在于我的代码转移。知道为什么它不起作用吗?我仔细检查了轮班,看起来它们的编码正确。

谢谢!

2 个答案:

答案 0 :(得分:2)

您链接的维基百科文章适用于 Base64 编码。假设这是你想要做的,你可以在这篇文章中找到答案:

How do I base64 encode (decode) in C?

答案 1 :(得分:0)

您的循环应为while(in_idx < size)while(out_idx < end_size)。现在,您将输入值与输出值进行比较,并将输出值除以即使为每个字节而不是每次迭代添加一个输出值。这将导致循环在处理完所有数据之前退出。由于ascii_out未初始化,如果输出的开头是正确的,这可能是唯一的问题,因为结尾将包含碰巧在该空间中的随机数据。