这是对base64进行解码的函数。 SIGSEGV(有时是SIGABORT)发生在所调用的malloc行中。 差点让我发疯! 提前致谢。

static char base64_table[255] = {'\0'};

static void base64_tableinit()
{
   int i,j;
   bzero(base64_table,255);
   for(j=0,i='A';i<='Z';i++) 
       base64_table[i]=j++;
   for(i='a';i<='z';i++)
       base64_table[i]=j++;
   for(i='0';i<='9';i++)
       base64_table[i]=j++;

   base64_table['+']=j++;
   base64_table['/']=j++;
   base64_table['=']=j;
}    
char *decode(const char *cptr,char **rptr)
{
    if(cptr==NULL)
    {
        fprintf (stderr, "The input string is NULL!\n");
        exit(1);
    }

    int len = strlen(cptr);
    if(len%4 != 0)  
    {
        fprintf (stderr, "The input string length is not 4X!\n");
        exit(1);
     }

     base64_tableinit();
     int clen=len/4;

#ifdef DEBUG
    /// printf ("The length of string len = %d\n",len);
    /// printf ("The length of string clen = %d\n",clen);
#endif
    char* res = NULL;
    /// Error: below, SIGSEGV
    if((res=(char *)malloc((len-clen + 1) * sizeof(char)))==NULL)
    {
        fprintf (stderr, "Can't malloc enough space in decode!\n");
        exit(1);
    }

    for(*rptr=res; clen>0; clen--)
    {
        *res = base64_table[(int)*cptr++]<<2 ;              /* Use the 1th char(6) */
        *res++|= base64_table[(int)*cptr]>>4 ;               /* Use the 2th char(2) */ /// Construct the first char 

        *res = base64_table[(int)*cptr++]<<4 ;              /* Use the 2th char(4) */
        *res++ |= base64_table[(int)*cptr]>>2 ;             /* Use the 3th char(4) */  /// Construct the second char 


        *res = base64_table[(int)*cptr++]<<6;               /* Use the 3th char(2) */
        *res++ |= base64_table[(int)*cptr++]&0x3f;          /* Use the 4th char(6) */  /// Construct the third char 

    }
    *(res+len-clen) = '\0';

    return *rptr;
}

gdb的回溯。

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb71a2b70 (LWP 5432)]
0xb7d450a6 in _int_malloc () from /lib/libc.so.6
(gdb) bt
0  0xb7d450a6 in _int_malloc () from /lib/libc.so.6
1  0xb7d4746c in malloc () from /lib/libc.so.6
2  0x0804b04c in decode (
cptr=0x806dce8  "PGRpdiBzdHlsZT0ibGluZS1oZWlnaHQ6MS43O2NvbG9yOiMwMDAwMDA7Zm9udC1zaXplOjE0cHg7Zm9udC1mYW1pbHk6YXJpYWwiPuato+W4uCA8YnI+PC9kaXY+PGJyPjxicj48c3BhbiB0aXRsZT0ibmV0ZWFzZWZvb3RlciI+PHNwYW4gaWQ9Im5ldGVhc2VfbWFp"..., rptr=0xb71a1fa8) at base64.c:78
3  0x0804d5af in email_decode (email_old=0xb71a1ffc, email_new=0xb71a1d50) at email_handle.c:421
4  0x0804a9c2 in PacketAnalyze () at packet_analyze.c:800
5  0xb7fa1cf2 in start_thread () from /lib/libpthread.so.0
6  0xb7da584e in clone () from /lib/libc.so.6

===============>>#1 票数:1

malloc中的分段错误是一个相当确定的信号,表明发生了一些野生内存损坏或有人free指向非动态分配内存的指针。 您显示的代码或触发SIGSEGV的代码不一定都发生两种错误。 但是,这两个错误通常都是由valgrind检测到的。

===============>>#2 票数:0 已采纳

这个:

*(res+len-clen) = '\0';

似乎是错误的,因为您已经在整个循环中增加了res ,所以可能应该是

*res = '\0';

  ask by louxiu translate from so

未解决问题?本站智能推荐:

2回复

base64解码不工作

我有以下代码: 它没有显示解码的字符串。 base64编码工作得很好,所以我做错了什么? 编辑:找到答案... base64解码需要'\\ n'
1回复

用openssl进行base64解码的一个非常奇怪的错误

我使用此代码执行base64解码工作,但发生了一个奇怪的错误。 像这样的短代码: 用以下代码编译此代码: 并运行: 预期产量 q:1; sid:1; q:1; sid:1; xa_en:hello; 到达输出 q:1; sid:1; q:0
1回复

ISO-8859-1的base64解码

我有以下字符串。 “这是测试字符串(à)与(ä)一些西欧字符(ß)” 使用http://www.motobit.com/util/base64-decoder-encoder.asp,我得到以下base64编码的字符串。 dGhpcyBpcyBhIHRlc3Qgc3RyaW5nIC
3回复

base64的解码表构造

我正在阅读这个libb64源代码,用于编码和解码base64数据。 我知道编码过程但我无法弄清楚如何构造以下解码表以便快速查找以执行编码的base64字符的解码。 这是他们使用的表格: 有人可以解释一下这个表中的值如何用于解码目的。
1回复

简单的base64解码不起作用:(

我一直在尝试使用以下代码对base *输入char *进行base64解码。 “ msg”的值似乎是一个空字符串:(
1回复

Base64。 我无法解码图像文件

我的代码有问题。 我得到了bmp图像并在base64中对其进行了编码。然后我想对其进行解码,但是我的PC上说:“无法加载图像'OUTPUT.PNG'”。如何解决? 我使用此网站对我的图片进行编码http://www.base64-image.de/step-2.php
1回复

base64在中间停止解码

我在互联网上找到的base64解码算法在中间停止解码,我不知道字符串是否太大(有592个字符),从base64解码为ASCII的字符串大小有限制。 预期结果: Lorem ipsum dolor坐镇,奉献自若,sius do eiusmod tempor incididunt u
1回复

C - 解码base64时的位移位

我正在尝试解码C中的base64数据。我发现了我想要使用的实现,但我不确定它是如何工作的,我希望对这里使用的一般语法有一些帮助/解释: Base64Decode 我试图理解的代码是: 我被困在* out ++ = buf >> 16; ,它告诉我,out的值将等于bu
1回复

解密(AES)和解码(Base64)后得到错误的纯文本

我编写了一个小型测试程序,该程序使用纯文本字符串,使用AES对其进行加密,然后将其编码为base64。这部分看起来不错,但是当我尝试对数据进行解码和解密时,会得到错误的信息。 我的代码如下。 我对C还是很陌生,所以我想我是错误地在某个地方使用了指针或引用而犯了一个菜鸟错误。 我试图在E
1回复

解码Base64字符串时如何处理错误

我试图编写一个小的Base64编码器/解码器程序,并且试图弄清当遇到无效字符时是否存在任何规则,准则或预期行为。 我可能会快速失败(抱怨并退出),忽略无效字符(例如我要换行,等等),或者采用垃圾输入,垃圾输出的方式(其中数据将被部分解码,其余部分将被解码)取决于严重性或错误的确切数量)。