Base64はデータをASCII文字列にエンコードする一般的な手法であり、C#プログラミングでは広く使われています。本記事では、C#でBase64エンコーディングとデコーディングを行う様々な方法を詳しく解説します。
Base64の基本
Base64エンコーディングは、バイナリデータ(例えば画像やファイル)をテキスト形式で保存や転送する際に便利です。C#では、System.Convertクラスを用いて簡単にBase64エンコーディングとデコーディングを行うことができます。
文字列をBase64にエンコード
string originalText = "Hello World!";
string base64Encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(originalText));
Console.WriteLine(base64Encoded); // 出力: SGVsbG8gV29ybGQh
string originalText = "Hello World!";:- この行では、
originalTextという名前の変数に”Hello World!”という文字列を代入しています。この文字列がBase64にエンコードされます。
- この行では、
string base64Encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(originalText));:- ここで、元の文字列
originalTextがBase64形式にエンコードされています。 Encoding.UTF8.GetBytes(originalText): まず、Encoding.UTF8.GetBytesメソッドを使用して、originalTextをUTF-8エンコーディングのバイト配列に変換します。UTF-8は、Unicode文字を表現するための標準的なエンコーディング方式です。Convert.ToBase64String(...): 次に、Convert.ToBase64Stringメソッドを使用して、バイト配列をBase64エンコードされた文字列に変換します。Base64は、バイナリデータをテキスト形式で表現するエンコーディング方式で、主にデータのテキスト転送に使用されます。
- ここで、元の文字列
Base64から文字列へのデコード
string decodedText = Encoding.UTF8.GetString(Convert.FromBase64String(base64Encoded));
Console.WriteLine(decodedText); // 出力: Hello World!
string decodedText = Encoding.UTF8.GetString(Convert.FromBase64String(base64Encoded));:- ここで、Base64エンコードされた文字列
base64Encodedがデコードされています。 Convert.FromBase64String(base64Encoded): まず、Convert.FromBase64Stringメソッドを使用して、Base64エンコードされた文字列base64Encodedをバイト配列に変換します。このメソッドは、Base64エンコーディングをデコードし、元のバイナリデータ(バイト配列)に戻します。Encoding.UTF8.GetString(...): 次に、Encoding.UTF8.GetStringメソッドを使用して、デコードされたバイト配列をUTF-8エンコーディングの文字列に変換します。このステップで、バイト配列が元のテキスト”Hello World!”に変換されます。
- ここで、Base64エンコードされた文字列
Base64で画像を扱う
C#で画像をBase64文字列に変換することも可能です。これはウェブ開発で特に役立ちます。
画像をBase64にエンコード
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
...
public string ImageToBase64(Image image, ImageFormat format)
{
using (MemoryStream ms = new MemoryStream())
{
// 画像をストリームに保存
image.Save(ms, format);
byte[] imageBytes = ms.ToArray();
// バイト配列をBase64文字列に変換
string base64String = Convert.ToBase64String(imageBytes);
return base64String;
}
}
using (MemoryStream ms = new MemoryStream()) { ... }:MemoryStreamクラスのインスタンスを作成しています。MemoryStreamは、バイト配列をメモリ内に格納するためのストリームです。usingステートメントは、MemoryStreamオブジェクトが使用後に適切に破棄されることを保証します。
// 画像をストリームに保存:- このコメントは、画像を
MemoryStreamに保存するコードがこの位置に来ることを示しています。 - 例えば、
image.Save(ms, format);のように、Saveメソッドを使用して画像をストリームに書き込むことができます。ここで、imageは保存する画像オブジェクトで、formatは画像のフォーマット(例: JPEG, PNG)を指定します。
- このコメントは、画像を
byte[] imageBytes = ms.ToArray();:MemoryStreamの内容(ここでは画像データ)をバイト配列に変換しています。ToArrayメソッドは、ストリームの内容を新しいバイト配列にコピーします。
string base64String = Convert.ToBase64String(imageBytes);:- バイト配列
imageBytesをBase64エンコーディングに変換しています。Convert.ToBase64Stringメソッドは、バイト配列をBase64形式の文字列に変換します。
- バイト配列
Base64から画像へのデコード
public Image Base64ToImage(string base64String)
{
// Base64文字列をバイト配列に変換
byte[] imageBytes = Convert.FromBase64String(base64String);
using (MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length))
{
// バイト配列から画像を生成
ms.Write(imageBytes, 0, imageBytes.Length);
Image image = Image.FromStream(ms, true);
return image;
}
}
byte[] imageBytes = Convert.FromBase64String(base64String);:- この行では、Base64エンコードされた文字列
base64Stringをバイト配列にデコードしています。Convert.FromBase64Stringメソッドは、Base64文字列をバイト配列に変換します。
- この行では、Base64エンコードされた文字列
using (MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length)) { ... }:- ここで、デコードされたバイト配列
imageBytesを含む新しいMemoryStreamインスタンスを作成しています。このストリームは、画像データを含んでいます。 usingステートメントは、MemoryStreamオブジェクトが使用後に適切に破棄されることを保証します。これにより、不要になったリソースが自動的に解放されます。
- ここで、デコードされたバイト配列
ms.Write(imageBytes, 0, imageBytes.Length);:- この行では、
MemoryStreamにimageBytesバイト配列を書き込んでいます。ただし、このステップは実際には不要で、MemoryStreamのコンストラクタで既にimageBytesがストリームに読み込まれています。
- この行では、
Image image = Image.FromStream(ms, true);:Image.FromStreamメソッドを使用して、MemoryStreamから画像を生成しています。ここで、trueパラメータはストリーム内のデータが画像の元データであることを示します。
return image;:- 最後に、生成された
Imageオブジェクトを返します。この画像は、元のBase64文字列から復元されたものです。
- 最後に、生成された
ファイルとBase64
ファイルをBase64に変換することで、テキストとして保存や送信が可能になります。これは様々な種類のファイルに対応しています。
ファイルをBase64にエンコード
public string FileToBase64(string filePath)
{
byte[] fileBytes = File.ReadAllBytes(filePath);
string base64String = Convert.ToBase64String(fileBytes);
return base64String;
}
byte[] fileBytes = File.ReadAllBytes(filePath);:- この行では、
File.ReadAllBytesメソッドを使用して指定されたファイルパスfilePathからファイルの内容をバイト配列fileBytesとして読み込んでいます。 ReadAllBytesメソッドは、ファイルのすべての内容を一度にメモリに読み込みます。このメソッドは非常に大きなファイルには適していない場合があるので、ファイルサイズに注意する必要があります。
- この行では、
string base64String = Convert.ToBase64String(fileBytes);:- ここで、読み込んだバイト配列
fileBytesをBase64エンコーディングに変換しています。 Convert.ToBase64Stringメソッドは、バイト配列をBase64形式の文字列に変換します。Base64は、バイナリデータをASCII文字列として表現するためのエンコーディング方式です。
- ここで、読み込んだバイト配列
return base64String;:- 最後に、Base64エンコードされた文字列
base64Stringを返します。
- 最後に、Base64エンコードされた文字列
Base64からファイルへのデコード
public void Base64ToFile(string base64String, string filePath)
{
byte[] fileBytes = Convert.FromBase64String(base64String);
File.WriteAllBytes(filePath, fileBytes);
}
byte[] fileBytes = Convert.FromBase64String(base64String);:- この行では、Base64エンコードされた文字列
base64Stringをバイト配列にデコードしています。 Convert.FromBase64Stringメソッドは、Base64文字列を対応するバイト配列に変換します。この操作により、Base64でエンコードされたデータが元のバイナリ形式に戻されます。
- この行では、Base64エンコードされた文字列
File.WriteAllBytes(filePath, fileBytes);:- ここで、
File.WriteAllBytesメソッドを使用して、バイト配列fileBytesの内容を指定されたファイルパスfilePathにあるファイルに書き込んでいます。 - このメソッドは、バイト配列の内容をファイルに書き込み、そのファイルが存在しない場合は新しく作成します。既存のファイルがある場合は、その内容を新しいデータで上書きします。
- ここで、
URLセーフなBase64エンコーディング
Webアプリケーションでは、URLで安全に伝達するためにURLセーフなBase64エンコーディングが必要になることがあります。C#では、以下のようにカスタムメソッドを作成して対応することができます。
public string Base64UrlEncode(byte[] input)
{
string base64 = Convert.ToBase64String(input);
// URLセーフな文字列に変換
return base64.Replace("+", "-").Replace("/", "_").Replace("=", "");
}
string base64 = Convert.ToBase64String(input);:- この行では、バイト配列
inputをBase64エンコーディングに変換しています。Convert.ToBase64Stringメソッドは、バイト配列をBase64形式の文字列に変換します。
- この行では、バイト配列
// URLセーフな文字列に変換:- このコメントは、次の処理がBase64エンコーディングされた文字列をURLセーフな形式に変換することを示しています。
return base64.Replace("+", "-").Replace("/", "_").Replace("=", "");:- ここで、Base64エンコーディングされた文字列
base64をURLで安全に使用するために変更しています。 - Base64エンコーディングは、通常
+、/、=といった文字を含むことがありますが、これらの文字はURLで特別な意味を持つため、URLでの使用に適していません。 .Replace("+", "-")と.Replace("/", "_")は、Base64文字列中の+と/をそれぞれ-と_に置き換えています。これにより、URL内で安全に使用できる文字列に変換されます。.Replace("=", "")は、Base64エンコーディングのパディング文字=を取り除いています。URL内での使用には必要ないため、削除することが一般的です。
- ここで、Base64エンコーディングされた文字列
まとめ
この記事では、C#でBase64エンコーディングとデコーディングを行う方法を様々な観点から解説しました。画像やファイルの扱い、URLセーフなエンコーディングなど、C#でのBase64操作は非常に多様で便利です。これらの知識を活用して、より効果的なプログラムを作成しましょう。

