【C#】byte配列とBase64文字列を相互に変換する

目次

概要

バイナリデータ(画像、PDF、暗号化されたキーなど)をJSONやHTTPヘッダーなどのテキスト形式で扱う際に必須となる、Base64エンコーディング処理の実装方法です。 標準ライブラリの System.Convert クラスを使用し、バイト配列とBase64文字列の相互変換を効率的に行います。

仕様(入出力)

  • 入力
    • エンコード時:任意の byte[](バイト配列)
    • デコード時:有効なBase64形式の string
  • 出力
    • エンコード時:Base64形式の string
    • デコード時:元の byte[]
  • 例外
    • デコード時、入力文字列が有効なBase64形式でない場合は FormatException が発生します。

基本の使い方

以下は、バイト配列をBase64文字列に変換し、再び元のバイト配列に戻す基本的な呼び出し例です。

byte[] sourceBytes = new byte[] { 0x48, 0x65, 0x6C, 0x6C, 0x6F }; // "Hello"

// byte[] -> Base64
string base64String = Convert.ToBase64String(sourceBytes);

// Base64 -> byte[]
byte[] decodedBytes = Convert.FromBase64String(base64String);

コード全文

文字列データをUTF-8バイト配列として取得し、それをBase64化して通信用の文字列形式にし、再度復元する一連の流れを実装したコンソールアプリケーションです。

using System;
using System.Text;

class Program
{
    static void Main()
    {
        try
        {
            // 1. 元のデータ(例: APIキーや認証トークン、画像データなど)
            string originalText = "User:Guest;Role:Admin;Exp:2025";
            Console.WriteLine($"[Original] {originalText}");

            // 文字列をバイト配列に変換(UTF-8)
            byte[] rawBytes = Encoding.UTF8.GetBytes(originalText);
            
            // ---------------------------------------------------------
            // 2. エンコード: byte[] -> Base64文字列
            // ---------------------------------------------------------
            string base64Encoded = Convert.ToBase64String(rawBytes);

            Console.WriteLine($"[Encoded ] {base64Encoded}");

            // ---------------------------------------------------------
            // 3. デコード: Base64文字列 -> byte[]
            // ---------------------------------------------------------
            // 受信側で元のバイナリに戻す処理
            byte[] restoredBytes = Convert.FromBase64String(base64Encoded);

            // バイト配列を文字列に戻して確認
            string restoredText = Encoding.UTF8.GetString(restoredBytes);
            Console.WriteLine($"[Restored] {restoredText}");

            // 整合性チェック
            bool isSame = originalText == restoredText;
            Console.WriteLine($"[Result  ] Success: {isSame}");
        }
        catch (FormatException ex)
        {
            Console.WriteLine($"[Error] Base64形式が不正です: {ex.Message}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"[Error] 予期せぬエラー: {ex.Message}");
        }
    }
}

実行結果例

[Original] User:Guest;Role:Admin;Exp:2025
[Encoded ] VXNlcjpHdWVzdDtSb2xlOkFkbWluO0V4cDoyMDI1
[Restored] User:Guest;Role:Admin;Exp:2025
[Result  ] Success: True

カスタムポイント

  • エンコーディングの変更
    • 文字列を変換元とする場合、Encoding.UTF8 以外にも Encoding.ASCIIEncoding.Unicode など、システムの要件に合わせてエンコーディングを指定してください。
  • 部分変換
    • Convert.ToBase64String には、配列のオフセットと長さを指定するオーバーロードがあります。巨大なバッファの一部だけを変換する場合に使用します。
  • オプション指定
    • Base64FormattingOptions.InsertLineBreaks を指定すると、出力文字列に改行を挿入できます(メール添付用などで76文字制限がある場合など)。

注意点

  1. データサイズの増加
    • Base64エンコードを行うと、データサイズは元のバイナリと比較して約1.33倍(約33%増)になります。帯域幅やストレージ容量の見積もりに注意が必要です。
  2. 文字列の正当性
    • FromBase64String は、入力文字列の長さが4の倍数でない場合や、使用できない文字が含まれている場合に即座に例外を投げます。ユーザー入力を扱う場合は必ず try-catch ブロックで囲むか、事前検証が必要です。
  3. URLでの使用
    • 標準のBase64にはURLで使用できない記号(+, /)が含まれます。URLパラメータとして渡す場合は、これらを置換する「URLセーフ」な処理が必要です(後述の応用を参照)。
  4. パディング文字
    • 末尾の = はパディング(埋め合わせ)文字です。これを不用意に削除するとデコードできなくなるため、そのまま扱う必要があります。

応用

URLセーフなBase64変換

Web APIのクエリパラメータやJWT(JSON Web Token)などで利用できるよう、+- に、/_ に置換し、パディング = を削除する実装例です。

using System;
using System.Text;

public static class Base64UrlUtil
{
    // URLセーフなBase64へエンコード
    public static string Encode(byte[] input)
    {
        string base64 = Convert.ToBase64String(input);
        // + -> -, / -> _, = 削除
        return base64.Replace('+', '-').Replace('/', '_').TrimEnd('=');
    }

    // URLセーフなBase64からデコード
    public static byte[] Decode(string input)
    {
        // - -> +, _ -> /
        string base64 = input.Replace('-', '+').Replace('_', '/');
        
        // パディング(=)の復元
        switch (base64.Length % 4)
        {
            case 2: base64 += "=="; break;
            case 3: base64 += "="; break;
        }
        
        return Convert.FromBase64String(base64);
    }
}

まとめ

Convert.ToBase64String および Convert.FromBase64String は、バイナリデータをテキストとして安全に転送・保存する必要がある場面に最適です。Web通信のコンテキストで利用する際は、標準のBase64記号をURLセーフな文字に置換する変更を加える必要があります。また、運用時にはエンコードによるデータサイズの増加や、不正な入力文字列による例外発生のリスクに注意して実装してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次