目次
概要
テキストデータをBase64形式に変換するためには、一度バイト配列を経由する必要があります。 本記事では、System.Text.Encoding と System.Convert を組み合わせ、文字列とBase64を正しく相互変換する実装パターンを解説します。
仕様(入出力)
- 入力
- エンコード時:任意の文字列
- デコード時:Base64形式の文字列
- 出力
- エンコード時:Base64化されたASCII文字列
- デコード時:復元された文字列
- 例外処理
- 不正なBase64文字列をデコードしようとした場合、
FormatExceptionが発生するため、適切に捕捉します。
- 不正なBase64文字列をデコードしようとした場合、
基本の使い方
Web標準で最も一般的な UTF-8 エンコーディングを使用した変換例です。
string source = "サンプルテキスト";
// String -> Base64
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(source);
string encoded = Convert.ToBase64String(bytes);
// Base64 -> String
byte[] decodedBytes = Convert.FromBase64String(encoded);
string decoded = System.Text.Encoding.UTF8.GetString(decodedBytes);
コード全文
ユーザーからの入力文字列を受け取り、Base64へ変換して表示し、その後デコードして元に戻ることを検証するコンソールアプリケーションです。
using System;
using System.Text;
class Program
{
static void Main()
{
try
{
// 1. 変換対象の文字列(例: JSONデータやメッセージ本文)
string message = "C# Programming & Base64";
Console.WriteLine($"[Original] {message}");
// 使用するエンコーディング(通常はUTF-8を推奨)
Encoding encoding = Encoding.UTF8;
// ---------------------------------------------------------
// 2. エンコード処理 (String -> byte[] -> Base64)
// ---------------------------------------------------------
// 文字列を直接Base64にはできないため、まずバイト配列にする
byte[] messageBytes = encoding.GetBytes(message);
// バイト配列をBase64文字列にする
string base64String = Convert.ToBase64String(messageBytes);
Console.WriteLine($"[Encoded ] {base64String}");
// ---------------------------------------------------------
// 3. デコード処理 (Base64 -> byte[] -> String)
// ---------------------------------------------------------
// Base64文字列をバイト配列に戻す
byte[] restoredBytes = Convert.FromBase64String(base64String);
// バイト配列を文字列に戻す(エンコード時と同じEncodingを使うこと)
string restoredMessage = encoding.GetString(restoredBytes);
Console.WriteLine($"[Decoded ] {restoredMessage}");
// ---------------------------------------------------------
// 4. 検証
// ---------------------------------------------------------
if (message == restoredMessage)
{
Console.WriteLine("[Check ] 正常に復元されました。");
}
}
catch (FormatException)
{
Console.WriteLine("[Error ] 無効なBase64文字列です。");
}
catch (Exception ex)
{
Console.WriteLine($"[Error ] {ex.Message}");
}
}
}
実行結果例
[Original] C# Programming & Base64
[Encoded ] QyMgUHJvZ3JhbW1pbmcgJiBCYXNlNjQ=
[Decoded ] C# Programming & Base64
[Check ] 正常に復元されました。
カスタムポイント
- 文字コードの変更
- レガシーシステムとの連携などで
Shift_JISやUnicode(UTF-16) が必要な場合は、Encoding.GetEncoding("Shift_JIS")やEncoding.Unicodeに変更してください。
- レガシーシステムとの連携などで
- 非同期処理
- 変換自体はCPUバウンドな処理であるため非同期メソッドはありませんが、ファイル読み書きやWeb通信と組み合わせる場合は
MemoryStreamなどを用いた非同期フローに組み込むことが一般的です。
- 変換自体はCPUバウンドな処理であるため非同期メソッドはありませんが、ファイル読み書きやWeb通信と組み合わせる場合は
注意点
- Encodingの不一致
- エンコード時とデコード時で異なる
Encodingを使用すると、文字化けが発生します。特にUTF-8とShift_JISの取り違えは一般的なバグの原因です。
- エンコード時とデコード時で異なる
- データ量の増加
- Base64エンコードを行うと、元のデータサイズより約33%サイズが増加します。巨大なテキストデータを扱う際はメモリ使用量に注意してください。
- セキュリティ
- Base64は暗号化ではありません。デコードすれば誰でも元の文章を読めるため、パスワードや個人情報を扱う場合は必ず暗号化処理を併用してください。
応用
拡張メソッドによる簡略化
頻繁に変換を行う場合、string型に対する拡張メソッドを定義しておくと便利です。
using System;
using System.Text;
public static class Base64Extensions
{
// 文字列自身をBase64化して返す
public static string ToBase64(this string text, Encoding encoding = null)
{
if (string.IsNullOrEmpty(text)) return string.Empty;
var enc = encoding ?? Encoding.UTF8;
return Convert.ToBase64String(enc.GetBytes(text));
}
// 自身がBase64であると仮定してデコードする
public static string DecodeBase64(this string base64, Encoding encoding = null)
{
if (string.IsNullOrEmpty(base64)) return string.Empty;
var enc = encoding ?? Encoding.UTF8;
return enc.GetString(Convert.FromBase64String(base64));
}
}
まとめ
文字列のBase64変換は、バイト配列への変換という中間ステップを挟むため、エンコーディングの選定が非常に重要です。システム全体で統一された文字コード(通常はUTF-8)を使用することで文字化けトラブルを防ぐことができます。また、Base64は可逆変換でありセキュリティ保護にはならない点を理解して利用してください。
