对于某些使用C的示例,Base64解码不正确

对于某些使用C的示例,Base64解码不正确,c,gcc,base64,C,Gcc,Base64,大家好,新年快乐 我想知道你们这些聪明人是否能帮助我。 我没有从解码以下内容中获得正确的输出: CChcAAjpqs2/SsTt1uu4bw== 我正在使用以下工具: CChcAAjpqs2/SsTt1uu4bw== base64.c/h从这里开始 我也试过一两次,结果也一样。 我的编译器是: gcc版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5) 这是我简单的主语 #include <stdio.h> #include <string.h>

大家好,新年快乐

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

CChcAAjpqs2/SsTt1uu4bw==
我正在使用以下工具:

CChcAAjpqs2/SsTt1uu4bw==
base64.c/h从这里开始 我也试过一两次,结果也一样。 我的编译器是: gcc版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5)

这是我简单的主语

#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;
}
我没想到。例如,我可以成功解码其他示例

HLJjwtxaMw+ZKPDEOqaf7g== 
所以我知道代码并不是完全错误的。最后,我还发现了一种从终端进行测试的奇妙方法,结果是一个长度超过3的字符数组,看起来差不多正确

echo `echo CChcAAjpqs2/SsTt1uu4bw== | python -m base64 -d`
对于新手程序员的任何建议都将不胜感激。多谢各位


Barry

您解码的字符串包含控制字符。结果以十六进制表示:

08 28 5c 00 08 e9 aa cd bf 4a c4 ed d6 eb b8 6f
ASCII中的
08
是一个退格,这就是输出中
buf
之后的
=
丢失的原因
28 5c
(\
00
\0
标记字符串的结尾,因此之后不再有输出

您不能以可读字符输出每个解码字符串。您必须在输出之前用转义序列或其他东西替换它们。实际上,我不知道是否有标准的库函数用于此。尤其是
\0
字符可能会给您带来其他一些函数的麻烦

buflen = (int)strlen(buf); 
buf
不是空分隔字符串,
strlen
将不起作用。 查看
ap\u base64 decode\u len()
,它似乎返回解码的buf长度

printf("buf=%s\nbuflen=%d\n",buf,buflen); 
此处相同,
%s
将不起作用。您将解码的buf视为字符串。 使用
%d
(获取ascii值)或十六进制逐字节打印

试试这个,你会看到发生了什么

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;
char*buf=0;
int-buflen=0;
buflen=ap_base64解码长度(“CChcAAjpqs2/SSTT1U4BW=”;
buf=b64_解码(“CChcAAjpqs2/SSTT1U4BW=”;
printf(“buflen=%d\n”,buflen);
int i;
对于(i=0;i
(base64-d | xxd)非常感谢民进党。