簡體   English   中英

如何在C中將圖像轉換為base64?

[英]How to Convert Image to base64 in C?

我需要將JPG圖像轉換為BASE64,才能將其插入到Cassandra集群中,所有這些都在C中,我發現了這個問題如何在C中對base64進行編碼(解碼)? 但是如果我嘗試將fRead的結果放在圖像上,似乎會出現分割錯誤,(不可打印的字符似乎會引起問題)

/* ----------------------------------------------------------------------------------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

提前致謝 !

這是錯誤的:

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

對於使用此代碼通過C將圖像轉換為base64的任何人,在base64.c base64_encode()函數中,我們應該

char *encoded_data = malloc(*output_length + 1); //add for null character char *encoded_data = malloc(*output_length + 1); //add for null character並在轉換后添加空字符:

encoded_data[*output_length] = 0;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM