假设以下代码,我的base64编码中出现了奇怪的错误。
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <stdio.h>
#include <string.h>
char * base64(unsigned char * input, int length) {
BIO *b64 = NULL;
BIO * bmem = NULL;
BUF_MEM *bptr = NULL;
char * output = NULL;
b64 = BIO_new((BIO_METHOD *)BIO_f_base64());
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
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);
output = (char *) calloc (bptr->length, sizeof(char));
memcpy(output, bptr->data, bptr->length);
BIO_free_all(b64);
return output;
}
int main(int argc, char *argv[]) {
char * based_string = NULL;
based_string = base64(argv[1], strlen(argv[1]));
printf("%s\n", based_string);
free(based_string);
return 0;
}
我用gcc test.c -o test -lcrypto
如果我跑:
./test testtes
我的结果是dGVzdHRlcw==�
而不是dGVzdHRlcw==
如果我跑:
./test test
我有dGVzdA==
作为回报,这是好结果。
以前的源代码有什么问题。
答案 0 :(得分:7)
output = (char *) calloc (bptr->length + 1, sizeof(char));
你错过了'+1',因此缓冲区中没有空余终结符的空间。