【发布时间】:2020-10-15 14:06:02
【问题描述】:
我已经使用了很多不同的函数来解码 C 中 Base64 编码的字符数组。现在,我正在使用这个函数来解码 Base64 字符数组。
unsigned int b64_decode(const unsigned char* in, unsigned int in_len, unsigned char* out) {
unsigned int i=0, j=0, k=0, s[4];
for (i=0;i<in_len;i++) {
s[j++]=b64_int(*(in+i));
if (j==4) {
out[k+0] = ((s[0]&255)<<2)+((s[1]&0x30)>>4);
if (s[2]!=64) {
out[k+1] = ((s[1]&0x0F)<<4)+((s[2]&0x3C)>>2);
if ((s[3]!=64)) {
out[k+2] = ((s[2]&0x03)<<6)+(s[3]); k+=3;
} else {
k+=2;
}
} else {
k+=1;
}
j=0;
}
}
return k;
}
问题是,对于像 QKSRjAEAAAAB3bW3rVpoJOA8bsb3eEuEEDiq 这样的 Base64 字符串,我得到的字符串只有五个字符,即使解码后的文本也应该更长。我尝试调试代码,这是因为第六个字符的位移结果为0,这意外地结束了字符串。在线 Base64 解码器可以毫无问题地解码上述字符串。
然后我想将解码后的字符串转换为十六进制。我是这样做的:
for (int i = 0, j = 0; i < size; ++i, j += 2) {
sprintf(data_hex + j, "%02x", decoded_data[i] & 0xff);
}
预期输入示例:QKSRjAEAAAAB3bW3rVpoJOA8bsb3eEuEEDiq
预期输出示例:40a4918c0100000001ddb5b7ad5a6824e03c6ec6f7784b841038aa
感谢您的回复。
【问题讨论】:
-
你试过一些位于here的解码器吗?
-
是的,我尝试了 OpenSSL 解决方案,但结果相同。
-
结果是@¤‘Ś 大小为 5
-
你在尝试使用 printf 吗?那是行不通的。试试
fwrite(string, 1, length, stdout);