函数的错误输出:C中的Base 64解码

时间:2014-05-15 11:05:51

标签: c encoding decoding

(我在互联网上找到了解码功能)

   /* 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中得到那些额外的字符?

1 个答案:

答案 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, ":");