我需要將JPG圖像轉換爲BASE64插入到Cassandra集羣中,所有在C中,我發現這How do I base64 encode (decode) in C?,但它似乎分段錯誤,如果我嘗試將fRead的結果放在圖像上,(Non-可印刷caracters似乎使問題)如何將圖像轉換爲C中的base64?
/* ----------------------------------------------------------------------------------Includes DO NOT MODIFY---------------------------------------------------------------------------------------------- */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#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 <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
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 << 0x08) + octet_c;
encoded_data[j++] = encoding_table[(triple >> 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;
}
有你有我可以用它來做到這一點的任何建議或LIB?
這裏GDB回溯:
#0 0x00000000004013e4 in base64_encode (data=0x604960 "\377\330\377", <incomplete sequence \340>, input_length=55605, output_length=0x401e20 <__libc_csu_init>) 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
提前感謝!
「這似乎分段錯誤」 不是十分確切。向我們顯示您的代碼,即最小的數量仍然會中斷。 – unwind 2014-10-03 08:04:45
您提供的鏈接中有十幾種不同的base64潛在解決方案。我們是否猜測你試過哪一個,並給你分段錯誤? – WhozCraig 2014-10-03 08:14:12
@WhozCraig我選擇了TopAnswer – 2014-10-03 08:17:23