你好,新年快乐,
我想知道你是否聪明的人能帮助我。 我没有通过解码以下内容获得正确的输出:
CChcAAjpqs2/SsTt1uu4bw==
我使用以下内容:
从这里base64.c / h http://opensource.apple.com/source/ChatServer/ChatServer-263/jabberd2/util/base64.c 我尝试过一两个具有相同结果的人。 我的编译器是: gcc版本4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)
这是我简单的main.c
#include <stdio.h>
#include <string.h>
#include "base64.h"
int main(void)
{
char* buf = 0;
int buflen = 0;
buf = b64_decode("CChcAAjpqs2/SsTt1uu4bw==");
if (buf)
{
buflen = (int)strlen(buf);
printf("buf=%s\nbuflen=%d\n",buf,buflen);
}
return 0;
}
它产生的结果是:
buf(\
buflen=3
我没想到。我可以成功解码其他示例,例如
HLJjwtxaMw+ZKPDEOqaf7g==
所以我知道代码没有完全破坏/错误。最后,我还发现了一种从我的终端进行测试的奇妙方法,这会产生一个长于3的char数组,看起来是正确的。
echo `echo CChcAAjpqs2/SsTt1uu4bw== | python -m base64 -d`
对于一个相当新手的程序员的任何建议都会真的很感激。谢谢。
百里
答案 0 :(得分:1)
您的解码字符串包含控制字符。结果是十六进制:
08 28 5c 00 08 e9 aa cd bf 4a c4 ed d6 eb b8 6f
ASCII中的 08
是退格键,这就是输出中=
之后的buf
丢失的原因。 28 5c
为(\
,00
为\0
标记字符串的结尾,因此之后不再有输出。
您无法以可读字符输出每个已解码的字符串。你必须在输出之前用一些转义序列或其他东西替换它们。我实际上不知道是否有标准的库函数。特别是\0
字符也可能会给你一些其他功能带来麻烦。
答案 1 :(得分:0)
buflen = (int)strlen(buf);
buf
不是以空分隔的字符串,strlen
将无效。
看看ap_base64decode_len()
,它似乎返回了解码的buf长度。
printf("buf=%s\nbuflen=%d\n",buf,buflen);
在这里,%s
将不起作用。你正在将解码的buf视为一个字符串。
使用%d
(获取ascii值)或Hex。
试试这个,你会看到发生了什么,
char* buf = 0;
int buflen = 0;
buflen = ap_base64decode_len("CChcAAjpqs2/SsTt1uu4bw==");
buf = b64_decode("CChcAAjpqs2/SsTt1uu4bw==");
printf("buflen=%d\n",buflen);
int i;
for(i=0; i < buflen; i++)
{
printf("%d,", (unsigned char) buf[i]);
}
return 0;