C#でのBase64
C#のConvert.ToBase64StringとConvert.FromBase64Stringを使ったBase64エンコード・デコード。ファイル処理、ストリーム、.NETのベストプラクティスを解説します。
Language
詳細な説明
C#は System.Convert クラスを通じてBase64サポートを提供しており、.NET Framework 1.0から利用可能です。APIはシンプルですが、エンコーディングや大容量データの扱いに関していくつかのニュアンスがあります。
基本的なエンコードとデコード:
using System;
using System.Text;
// Encoding
string original = "Hello, World!";
byte[] bytes = Encoding.UTF8.GetBytes(original);
string encoded = Convert.ToBase64String(bytes);
// Result: "SGVsbG8sIFdvcmxkIQ=="
// Decoding
byte[] decodedBytes = Convert.FromBase64String(encoded);
string decoded = Encoding.UTF8.GetString(decodedBytes);
// Result: "Hello, World!"
ファイルのエンコード:
// Encode a file to Base64
byte[] fileBytes = File.ReadAllBytes("image.png");
string base64File = Convert.ToBase64String(fileBytes);
// Decode Base64 to file
byte[] outputBytes = Convert.FromBase64String(base64File);
File.WriteAllBytes("output.png", outputBytes);
フォーマットオプション: Convert.ToBase64String は改行を制御する Base64FormattingOptions 列挙型を受け付けます:
// Insert line breaks every 76 characters (MIME-compatible)
string formatted = Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks);
// No line breaks (default)
string compact = Convert.ToBase64String(bytes, Base64FormattingOptions.None);
SpanベースのAPI(.NET Core 2.1以降): パフォーマンスが重要なコードでは、不必要なメモリ割り当てを避けるためにSpanベースのオーバーロードを使用しましょう:
// Encode with Span<T>
Span<byte> source = stackalloc byte[] { 72, 101, 108, 108, 111 };
Span<char> destination = stackalloc char[8];
Convert.TryToBase64Chars(source, destination, out int charsWritten);
// Decode with Span<T>
ReadOnlySpan<char> base64Span = "SGVsbG8=".AsSpan();
Span<byte> output = stackalloc byte[5];
Convert.TryFromBase64Chars(base64Span, output, out int bytesWritten);
よくある間違い:
Encoding.UTF8.GetBytes()の代わりにEncoding.ASCII.GetBytes()を使用すること。ASCIIは非ASCII文字を暗黙的に?に置き換えるため、国際的なテキストに対して不正なBase64出力が生成されます。- ユーザー入力のBase64文字列をデコードする際に
FormatExceptionを処理しないこと。常にConvert.TryFromBase64String()(.NET Core 2.1以降で利用可能)で検証するか、try-catchで囲みましょう。 File.ReadAllBytes()で非常に大きなファイルをメモリに丸ごと読み込むこと。数百メガバイトを超えるファイルでは、CryptoStreamとToBase64Transformを使ったストリーミングを利用しましょう。
ユースケース
専用のBlob Storageアカウントを追加するほどではないケースで、ユーザーがアップロードしたプロフィール画像をBase64に変換してAzure Cosmos DBドキュメントに格納する場合に使用します。