我正在尝试让我的解码器代码工作。我正在使用来自 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 索引的转换,这似乎工作正常。问题出在我的移动代码中。知道为什么它不起作用吗?我仔细检查了类次,它们看起来编码正确。
谢谢!
最佳答案
你的循环应该是 while(in_idx < size)
或 while(out_idx < end_size)
.现在您正在比较输入值和输出值,以及除以输出值,即使您为每个字节而不是每次迭代添加一个。这将导致您的循环在处理完所有数据之前就退出。自 ascii_out
没有初始化,如果输出的开头是正确的,这可能是唯一的问题,因为结尾将包含恰好在该空间中的随机数据。
关于c - 在 C 中解码 base64 编码的二进制字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6713737/