LoginSignup
7
8

More than 5 years have passed since last update.

[C言語] ファイルを BASE64 に変換する

Posted at

GLib の g_base64_encode() を使う

file2base64.c
#include <stdio.h>
#include <stdlib.h>
#include <glib.h>

int main(int argc, char *argv[]) {
  // 変数宣言
  FILE* fp;
  long filesize;
  unsigned char* buffer;
  gchar* base64;

  // ファイル名が渡されなかったら終了
  if (argc < 2) {
    fprintf (stderr, "usage: %s filename\n", argv[0] );
    return 1;
  }

  // ファイルを開く
  fp = fopen(argv[1], "rb");

  // ファイルを開けなかったら終了
  if (fp == NULL) {
    printf("ファイルを開けませんでした\n");
    return 1;
  }

  // ファイルサイズ取得 
  fseek(fp, 0, SEEK_END);
  filesize = ftell(fp);
  fseek(fp, 0, SEEK_SET);

  // 読み込み用のバッファーを作成
  buffer = calloc(filesize, sizeof(unsigned char));

  // ファイルデータをメモリに読み込む
  if (fread(buffer, sizeof(unsigned char), filesize, fp)) {

    // BASE64 に変換
    base64 = g_base64_encode(buffer, filesize);

    // 出力
    printf("%s\n", base64);
    g_free(base64);
  }

  // 終了処理
  free(buffer);
  fclose(fp);

  return 0;
}

GLib に頼りきったバージョン

file2base64_by_gmappedfile.c
#include <glib.h>
#include <glib/gstdio.h>

int main(int argc, char *argv[]) {
  // 変数宣言
  GError** error;
  GMappedFile* fp;
  gsize filesize;
  gchar* buffer;
  gchar* base64;

  // ファイル名が渡されなかったら終了
  if (argc < 2) {
    fprintf (stderr, "usage: %s filename\n", argv[0] );
    return 1;
  }

  // ファイルを開く
  error = NULL;
  fp = g_mapped_file_new(argv[1], FALSE, error);

  // ファイルを開けなかったら終了
  if (fp == NULL) {
    printf("ファイルを開けませんでした\n");
    return 1;
  }

  // ファイルサイズ取得 
  filesize = g_mapped_file_get_length(fp);

  // ファイルデータをメモリに読み込む
  buffer = g_mapped_file_get_contents(fp);
  if (buffer) {

    // BASE64 に変換
    base64 = g_base64_encode((guchar *)buffer, filesize);

    // 出力
    printf("%s\n", base64);
    g_free(base64);
  }

  // 終了処理
  g_mapped_file_unref(fp);

  return 0;
}

GLib って便利ですね。

参考

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8