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

标签 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 索引的转换,这似乎工作正常。问题出在我的移动代码中。知道为什么它不起作用吗?我仔细检查了类次,它们看起来编码正确。

谢谢!

最佳答案

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

关于c - 在 C 中解码 base64 编码的二进制字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6713737/

相关文章:

c - 如何替换 time() 函数来测试生产库?

C : Linux Sockets: Recvfrom() too slow in fetching the UDP Packets

c - 使用 C 从给定数据库文件中仅打印 x y z 中的 x 坐标

java - 编码/解码奇怪的问题

c - 目标文件到二进制代码

java - Base64 不对整个字符串进行编码

base64 - 2 台不同机器上 CFML 中 toBase64() 的不同输出

javascript - 从 FormData 实例中的 base64 编码的 png 图像生成的 Blob 在服务器端被识别为应用程序/八位字节流

android - 如何将 H.264 NAL 单元提供给 Android MediaCodec 进行解码?

swift - 打开 MPO 文件并提取嵌入的图像