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 って便利ですね。
##参考