问题描述
我已经使用了许多不同的函数来解码C语言中的Base64编码的char数组。现在,我正在使用此函数来解码Base64的char数组。
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
感谢您的回复。
解决方法
好吧,花了一段时间才弄清楚您从何处获得此代码。关键是意识到b64_int()
不是标准库函数。
因此,为了后代,您的代码的原始来源为here,位于文件base64.h和base64.cc中。
这是有效的程序:
#include <stdio.h>
#include <string.h>
#include "base64.h"
int main(void) {
unsigned char in[] = "QKSRjAEAAAAB3bW3rVpoJOA8bsb3eEuEEDiq\0";
int inLength = strlen((char*)in);
unsigned char out[1000];
unsigned int outLength = b64_decode(in,inLength,out);
// Prints the result in Hexadecimal format.
for (int i = 0; i < outLength; i++)
printf("%x",out[i]);
printf("\n");
return 0;
}
关键在于捕获b64_decode()
的返回值,该值告诉您期望结果中有多少字节。尚不清楚是否执行此操作,因为没有提供调用b64_decode()
函数的程序的代码示例。