C#でBase64形式で文字列やファイルをエンコード・デコードする

C#でもASP. NET Coreなどの環境がだんだん発達してきて、WebAPIを作成したり繋いだりするケースが増えてきていると思います。

そこで、受け取ったJSON中のBase64文字列をデコードしたりする場合があると思いますがが、そういった場合、C#でどのように取り扱えばよいかを紹介したいと思います。

  • 内容
    • 文字列をBase64へエンコード・デコードする
    • ファイルの内容をBase64で読み込む・書き込む

文字列のをBase64へエンコード・デコードする

基本的にC#のライブラリに機能があるのですが、多少操作が冗長なので自作のクラスで使いやすいようにラップすることになると思います。まずは通常の文字列 ⇔ Base64文字列を扱うための操作となります。

WebAPIのJsonに入れる場合はこんな事しないのでまぁ参考までにって感じですかね?

// Base64形式の汎用操作を提供するクラス
public static class Base64
{
    // 指定した通常の文字列をUTF-8としてBase64文字列に変換する
    public static string Encode(string str)
    {
        return Encode(str, Encoding.UTF8);
    }
    // 上記のエンコードが指定できるバージョン
    public static string Encode(string str, Encoding encode)
    {
        return Convert.ToBase64String(encode.GetBytes(str));
    }

    // 指定したBase64文字列をUTF-8として通常の文字列に変換する
    public static string Decode(string base64Str)
    {
        return Decode(base64Str, Encoding.UTF8);
    }
    // 上記のエンコードが指定できるバージョン
    public static string Decode(string base64Str, Encoding encode)
    {
        return encode.GetString(Convert.FromBase64String(base64Str));
    }
}

上記の操作のそれぞれの使用方法は以下の通りです。

static void Main(string[] args)
{
    // 変換元の文字列
    string sourceStr = "123890abcxyzあいう柄尾";

    // UTF-8としてBase64に変換
    string base64StrUtd8 = Base64.Encode(sourceStr);
    Console.WriteLine(base64StrUtd8); // > MTIzODkwYWJjeHl644GC44GE44GG5p+E5bC+
    
    // 元にもどす
    string planeTextUtd8 = Base64.Decode(base64StrUtd8);
    Console.WriteLine(planeTextUtd8);

    // -x-x-x-x-x-x-x-

    // Shift-JISとしてBase64に変換
    string base64StrShiftJis = Base64.Encode(sourceStr, Encoding.GetEncoding("shift-jis"));
    Console.WriteLine(base64StrShiftJis); // > MTIzODkwYWJjeHl6gqCCooKklb+U9g==

    // 元にもどす
    string planeTextShiftJis = Base64.Decode(base64StrShiftJis, Encoding.GetEncoding("shift-jis"));
    Console.WriteLine(planeTextShiftJis);

    // -x-x-x-x-x-x-x-

    // ダメな例:UTF-8でエンコードしてShift-JISで戻ると文字化けしちゃう
    string badString = Base64.Decode(base64StrUtd8, Encoding.GetEncoding("shift-jis"));
    Console.WriteLine(badString); // 123890abcxyz縺ゅ>縺・氛蟆セ
}

マルチバイトな文字列を変換する場合、変換した時と同じエンコードでデコードするようにしましょう。

ファイルの内容をBase64へエンコード・デコードする

ファイルを読み取って内容をBase64で取得したり、Base64の文字列を受け取って通常の文字列としてファイルに保存する方法です。

この場合、ファイルの内容はエンコードを無視してバイト配列で読み取っているので、読んで書くとオリジナルのエンコードが復元できる形になります。画像などのデータはこの形式で受け取ったらそのままファイルに保存すると元のデータを復元できます。

public static class Base64
{
    // ---- 以下追加 ----

    // ファイルの内容を読み取ってそ内容をBase64文字列として取得する
    public static string ReadWithEncode(string filePath)
    {
        return Convert.ToBase64String(File.ReadAllBytes(filePath));
    }

    // Base64文字列を通常の文字列に変換してファイルに保存します
    public static void SaveWithDecode(string base64Str, string savePath)
    {
        byte[] barray = Convert.FromBase64String(base64Str);
        using (var fs = new FileStream(savePath, FileMode.Create))
        {
            fs.Write(barray, 0, barray.Length);
        }
    }
}

操作の使用方法は以下の通り。ファイルからBase64を取り出したり、受け取ったらファイルに書き込んだりするだけです。こっちのほうが使用するタイミングは多いと思います。

static void Main(string[] args)
{
    // 読み取る画像ファイル
    string filePath = @"D:\image.png";

    // ファイルを読みとってBase64にエンコード
    string encodeBody = Base64.ReadWithEncode(filePath);

    // Base64をファイルに保存
    Base64.SaveWithDecode(encodeBody, @"d:\image2.png");
}

簡単ですが今回は以上です。