如何在C中将图像转换为base64?

我需要将JPG图像转换为BASE64以插入到Cassandra集群中,所有在C中,我发现这个如何在C中进行base64编码(解码)? 但是如果我试图将fRead的结果放在图像上,它就会出现分段错误,(不可打印的caracters似乎会产生问题)

/* ----------------------------------------------------------------------------------Includes DO NOT MODIFY---------------------------------------------------------------------------------------------- */ #include  #include  #include  #include  #include  #include  #include  #include "cassandra.h" #include "../headers/other.h" size_t fileLen; /* ---------------------------------------------------------------------------------------CONFIG HERE !---------------------------------------------------------------------------------------------------*/ /* ---------Connection---------- */ const char *server_adress = "127.0.0.1"; /* Insert your server adress here */ const char *keyframe = "hallo"; /* Insert name of the table you want to insert your data into (Must be created) */ const char *table = "blobi"; /* Insert name of the table you want to insert your data into (Must be created) */ const char *column_name1 = "file_name"; /* Insert name of the column for the key input */ const char *column_name2 = "content"; /* Insert name of the column for the blob input */ /* ------------Data------------- */ const char *file_path = "/home/nicolas/Pictures/Minions.jpg"; /* Insert the name of the binary to read and input into your table (changes coming soon !) */ /* -------------------------------------------------------------------------------Do not modify beyond this point ----------------------------------------------------------------------------------------*/ void ReadFile(const char *name) { FILE *file; unsigned char *buffer; char *lobi; //Open file file = fopen(name , "rb"); if (!file) { fprintf(stderr, "Unable to open file %s", name); return; } //Get file length fseek(file, 0, SEEK_END); fileLen=ftell(file); fseek(file, 0, SEEK_SET); //Allocate memory buffer=(char *)malloc(fileLen+1); if (!buffer) { fprintf(stderr, "Memory error!"); fclose(file); return; } //Read file contents into buffer fread(buffer, fileLen, 1, file); size_t *output_length; lobi = base64_encode(buffer, fileLen, output_length); printf("%s\n", lobi); fclose(file); insert_blob(buffer); free(buffer); } 

这是base64.c

 #include  #include  #include  #include  #include  static char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; static char *decoding_table = NULL; static int mod_table[] = {0, 2, 1}; void build_decoding_table() { decoding_table = malloc(256); for (int i = 0; i < 64; i++) decoding_table[(unsigned char) encoding_table[i]] = i; } char *base64_encode(const unsigned char *data, size_t input_length, size_t *output_length) { *output_length = 4 * ((input_length + 2) / 3); char *encoded_data = malloc(*output_length); if (encoded_data == NULL) return NULL; for (int i = 0, j = 0; i < input_length;) { uint32_t octet_a = i < input_length ? (unsigned char)data[i++] : 0; uint32_t octet_b = i < input_length ? (unsigned char)data[i++] : 0; uint32_t octet_c = i < input_length ? (unsigned char)data[i++] : 0; uint32_t triple = (octet_a << 0x10) + (octet_b <> 3 * 6) & 0x3F]; encoded_data[j++] = encoding_table[(triple >> 2 * 6) & 0x3F]; encoded_data[j++] = encoding_table[(triple >> 1 * 6) & 0x3F]; encoded_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F]; } for (int i = 0; i < mod_table[input_length % 3]; i++) encoded_data[*output_length - 1 - i] = '='; return encoded_data; } 

你有什么建议或者我可以用来做这个吗?

这里是gdb上的回溯:

 #0 0x00000000004013e4 in base64_encode (data=0x604960 "\377\330\377", , input_length=55605, output_length=0x401e20 ) at sources/base64.c:30 #1 0x0000000000401a45 in ReadFile (name=0x401ed0 "/home/nicolas/Pictures/Minions.jpg") at sources/blob_test.c:81 #2 0x0000000000401b2e in main () at sources/blob_test.c:110 

提前致谢 !

这是错的:

 size_t *output_length; // declared an indeterminate pointer lobi = base64_encode(buffer, fileLen, output_length); // sends bogus address 

它应该是

 size_t output_length = 0; // note *NOT* a pointer lobi = base64_encode(buffer, fileLen, &output_length); // note address-of operator