2017-06-20 100 views
0

我正在用C编写一个简单的Base64解码函数。当使用printf()调试行如下时,此函数的输出看起来是正确的(基于比较结果与现有工具):C数组不保留值

unsigned char * b64decode(char *line) 
{ 
    char *idx; 
    unsigned char *decode; 
    int i,j,len,dlen,hold = 0; 

    idx = strchr(line, '\n');  //index of newline 
    len = idx - line;    //lenght of string 
    dlen = 3 * (len/4);    //decoded length 

    decode = malloc((sizeof(unsigned char) * dlen) + 1); 
    pad = 0; 

    for (i = 0; i <= len; i++) {  //deindex from ASCII 
     line[i] = deindex(line[i]); 
    } 

    for(i = 0, j = u0; i < len; i++,j++) { 
     hold |= (line[i] << 18); 
     hold |= (line[++i] << 12); 
     hold |= (line[++i] << 6); 
     hold |= line[++i]; 

     decode[j] = hold >> 16; 
     printf("%d ", decode[j]); 
     decode[++j] = (hold >> 8) & 0xFF; 
     printf("%d ", decode[j]); 
     decode[++j] = hold & 0xFF; 
     printf("%d ", decode[j]); 

    hold = 0; 
    } 

    if (pad)       //terminate before padding 
     decode[dlen - pad] = '\0'; 

    return decode; 

} 

其产生(部分)输出:

29 66 31 77 11 15 2 31 79 19 78 60 26 105 101 31 73 28 14 78 19 1 11 7 
78 27 1 22 69 54 0 30 1 73 100 32 84 29 29 67 51 83 78 101 82 6 0 71 84 
28 13 69 77 7 4 12 83 18 60 12 30 8 73 26 9 17 79 20 76 33 26 71 43 0 5 
29 71 89 17 4 9 0 100 38 7 83 0 55 22 6 12 26 23 65 29 1 82 84 48 95 0 32 
19 10 5 71 79 18 72 8 69 78 101 

当我尝试与这些printf()的线离开的for循环之后访问此阵列,就会出现问题。这for循环(最大I值是任意的)...

for (i = 0; i < 100; i++) { 
    printf("%d ", decode[i]); 
} 

产生这样的输出...

29 66 31 77 11 15 2 31 79 19 78 60 26 105 101 31 73 28 14 78 19 1 11 7 78 
27 1 22 69 54 0 30 1 73 100 32 84 29 29 67 51 83 78 101 82 6 0 71 84 28 
13 69 77 7 4 12 83 18 60 12 30 8 73 26 9 17 79 20 76 33 26 71 43 0 5 29 
71 89 17 4 9 0 100 38 7 83 0 55 22 6 12 26 23 65 29 1 82 84 48 95 0 32 19 
10 5 71 79 168 187 158 23 131 127 0 0 168 187 158 23 131 127 0 0 0 0 0 0 
0 0 0 0 65 0 0 0 0 0 0 0 88 187 158 23 131 127 0 0 88 187 158 23 131 127 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 0 
0 0 0 0 0 0 16 16 0 0 0 0 0 0 72 85 73 102 

任何人都可以让我知道我做错了吗?

+2

显示我们的实际工作代码。 – DevilaN

+1

什么是'j = u0'? –

+0

赠送[mcve]。然而,对于它的价值,我认为数据的尾部必须在你展示的函数之外被破坏。 –

回答

0

好的人,发现这个问题。这里显示的函数工作,问题原来是在处理我上面的函数的函数中调用了一个realloc()错误的解码。解决这个问题产生了正确的结果。

猜猜这是提供更多上下文的快速课程!