(我在互联网上找到了解码功能)
/* Macro definitions */
#define TABLELEN 63
#define BUFFFERLEN 128
#define ENCODERLEN 4
#define ENCODEROPLEN 0
#define ENCODERBLOCKLEN 3
#define PADDINGCHAR '='
#define BASE64CHARSET "ABCDEFGHIJKLMNOPQRSTUVWXYZ"\
"abcdefghijklmnopqrstuvwxyz"\
"0123456789"\
"+/";
int decodeblock(char *input, char *output, int oplen){
int rc = 0;
char decodedstr[ENCODERLEN + 1] = "";
decodedstr[0] = input[0] << 2 | input[1] >> 4;
decodedstr[1] = input[1] << 4 | input[2] >> 2;
decodedstr[2] = input[2] << 6 | input[3] >> 0;
strncat(output, decodedstr, oplen-strlen(output));
return rc;
}
int Base64Decode(char *input, char *output, int oplen){
char *charval = 0;
char decoderinput[ENCODERLEN + 1] = "";
char encodingtabe[TABLELEN + 1] = BASE64CHARSET;
int index = 0, asciival = 0, computeval = 0, iplen = 0, rc = 0;
iplen = oplen;
while(index < iplen){
asciival = (int)input[index];
if(asciival == PADDINGCHAR){
rc = decodeblock(decoderinput, output, oplen);
break;
}else{
charval = strchr(encodingtabe, asciival);
if(charval){
decoderinput[computeval] = charval - encodingtabe;
computeval = (computeval + 1) % 4;
if(computeval == 0){
rc = decodeblock(decoderinput, output, oplen);
decoderinput[0] = decoderinput[1] =
decoderinput[2] = decoderinput[3] = 0;
}
}
}
index++;
}
return rc;
}
这就是我调用函数的方式:
char decodedstring[10];
ha = Base64Decode(authTable[0]->AuthenticationCred[k].userpassb64,decodedstring, outlen);
*userId = strtok(decodedstring, ":");
代码运行,但输出为false。 输出应为:username:password。但在这种情况下,输出为 \ 006 \ busername:password 。 我需要从 decodedstring 中提取用户名。由于用户名之前的额外字符,它不起作用。
这个函数出了什么问题,或者为什么我会在begnning中得到那些额外的字符?
答案 0 :(得分:1)
解码器正常工作,问题是您没有初始化输出缓冲区。解码器总是使用strncat函数来追加输出字符。您的输出缓冲区可能在statup中具有垃圾值,因此实际解码的值将附加到垃圾值。在使用之前添加一个memset来初始化输出缓冲区,一切都应该正常工作。而且正如Gil Hamilton在评论中所提到的,这个解码器只适用于文本输出,试图解码二进制输出会导致错误。
char decodedstring[30];
memset(&decodedstring[0], 0, 30);
ha = Base64Decode(authTable[0]->AuthenticationCred[k].userpassb64,decodedstring, outlen);
*userId = strtok(decodedstring, ":");