2014-04-04 88 views
1

我想使用C编码base64和OpenSSL的字符串,稍后在C#中对其进行解码。我有编码下面的代码:使用C和OpenSSL进行base64编码

char *base64(const char *input, int length) { 
    BIO *bmem, *b64; 
    BUF_MEM *bptr; 

    b64 = BIO_new(BIO_f_base64()); 
    bmem = BIO_new(BIO_s_mem()); 
    b64 = BIO_push(b64, bmem); 
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); 
    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; 
} 

的问题是,当我在C#中对其进行解码,我得到以下错误:

Invalid length for a Base-64 char array or string. 

搜索我发现,解码后的字符串长度无效后我开始玩编码的字符串,发现(在我看来)OpenSSL库不会将新行\ n字符作为单个换行符加密,而是作为两个单独的符号进行加密。我的编码错了吗,错误地考虑过换行符还是可以做其他事情?不要认为需要另一个代码片段,所以这是我粘贴的唯一代码片段,但如果需要,将提供另一个代码片段。

+0

不相关,但请不要投射'malloc'的返回指针 –

回答

2

问题是在

char *buff = (char *)malloc(bptr->length); 
memcpy(buff, bptr->data, bptr->length-1); 
buff[bptr->length-1] = 0; 

因为,它留下比为Base64少一个字节。

应该

char *buff = (char *)malloc(bptr->length+1); 
memcpy(buff, bptr->data, bptr->length); 
buff[bptr->length] = 0; 

这应该工作。