Base64解码无法正常工作

3

我有以下代码:

char *encoded = "dGhpcyBpcyBhIHRlc3Qgc3RyaW5n";
char *unbase = unbase64(encoded,strlen(encoded));
printf("original: %s\n",unbase);
free(unbase);


char *unbase64(unsigned char *input,int length)
{
    BIO *b64,*bmem;
    char *buff = (char *)malloc(length);
    b64 = BIO_new(BIO_f_base64());
    bmem = BIO_new_mem_buf(input,length);
    bmem = BIO_push(b64,bmem);
    BIO_read(bmem,buff,length);
    BIO_free_all(bmem);
    return buff;
}

char *base64(const unsigned char *input,int length)
{
    BIO *bmem,*b64 = NULL;
    BUF_MEM *bptr;
    b64 = BIO_new(BIO_f_base64());
    bmem = BIO_new(BIO_s_mem());
    b64 = BIO_push(b64,bmem);
    BIO_write(b64,input,length);
    BIO_flush(b64);
    BIO_get_mem_ptr(b64,&bptr);
    char *buff = (char *)malloc(bptr->length);
    memcpy(buff,bptr->data,bptr->length-1);
    buff[bptr->length-1] = 0;
    BIO_free_all(b64);
    return buff;
}

这段代码没有显示解码后的字符串。

base64编码正常工作,那么我做错了什么?

编辑:找到答案了... base64解码需要 '\n'。


我已经在我的程序中使用了openssl,因为它在其他函数中是必需的,所以没有必要创建已在openssl中定义的函数。 - Sam Reina
@RahulTripathi,他不需要使用与此问题无关的语言进行base64解码,更不需要使用算法进行解码。他只是想知道在他的BIO设置中可能出了什么问题,导致OpenSSL的base6 bio-filter失败。 - WhozCraig
'\n' 需要放在哪里?需要放在 encoded 的末尾吗? - chux - Reinstate Monica
是的,编码字符串必须以\n结尾。 - Sam Reina
2个回答

2

OpenSSL API 很难使用,所以我对你的勇气表示赞赏。无论如何,正如你在注释中所提到的,解码器需要一个换行符,除非你明确告诉它不需要,下面的代码就是这样做的:

char *unbase64(void *input, int length)
{
    char *res = malloc(length);
    BIO *bmem = BIO_new_mem_buf(input, length);
    BIO *b64 = BIO_new(BIO_f_base64());
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    bmem = BIO_push(b64, bmem);

    long n = BIO_read(bmem, res, length);
    if (n > 0)
        res[n] = 0;
    else
        res[0] = 0; // note: this is an error state.

    BIO_free_all(bmem);

    return res;
}

运行以下内容,将会得到您的数据结果:
original: this is a test string

是的,因为那很直观。

0

内存分配不足

// char *buff = (char *)malloc(length);
char *buff = (char *)malloc(length + 1);
// may also need
buff[length] = '\0';

疑似存在其他问题。


同一个函数在另一种情境下却工作正常,这真的很奇怪。 - Sam Reina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接