使用C的一些示例的Base64解码不正确

时间:2014-01-02 23:00:00

标签: c gcc base64

你好,新年快乐,

我想知道你是否聪明的人能帮助我。 我没有通过解码以下内容获得正确的输出:

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`

对于一个相当新手的程序员的任何建议都会真的很感激。谢谢。

百里

2 个答案:

答案 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;