PR

【C#】バイナリデータはBase64で!エンコード、デコード、画像変換、ファイル操作まで

【C#】
広告

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
  1. string originalText = "Hello World!";:
    • この行では、originalTextという名前の変数に”Hello World!”という文字列を代入しています。この文字列がBase64にエンコードされます。
  2. 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!
  1. 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で画像を扱う

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;
    }
}
  1. using (MemoryStream ms = new MemoryStream()) { ... }:
    • MemoryStreamクラスのインスタンスを作成しています。MemoryStreamは、バイト配列をメモリ内に格納するためのストリームです。
    • usingステートメントは、MemoryStreamオブジェクトが使用後に適切に破棄されることを保証します。
  2. // 画像をストリームに保存:
    • このコメントは、画像をMemoryStreamに保存するコードがこの位置に来ることを示しています。
    • 例えば、image.Save(ms, format);のように、Saveメソッドを使用して画像をストリームに書き込むことができます。ここで、imageは保存する画像オブジェクトで、formatは画像のフォーマット(例: JPEG, PNG)を指定します。
  3. byte[] imageBytes = ms.ToArray();:
    • MemoryStreamの内容(ここでは画像データ)をバイト配列に変換しています。ToArrayメソッドは、ストリームの内容を新しいバイト配列にコピーします。
  4. 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;
    }
}
  1. byte[] imageBytes = Convert.FromBase64String(base64String);:
    • この行では、Base64エンコードされた文字列base64Stringをバイト配列にデコードしています。Convert.FromBase64Stringメソッドは、Base64文字列をバイト配列に変換します。
  2. using (MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length)) { ... }:
    • ここで、デコードされたバイト配列imageBytesを含む新しいMemoryStreamインスタンスを作成しています。このストリームは、画像データを含んでいます。
    • usingステートメントは、MemoryStreamオブジェクトが使用後に適切に破棄されることを保証します。これにより、不要になったリソースが自動的に解放されます。
  3. ms.Write(imageBytes, 0, imageBytes.Length);:
    • この行では、MemoryStreamimageBytesバイト配列を書き込んでいます。ただし、このステップは実際には不要で、MemoryStreamのコンストラクタで既にimageBytesがストリームに読み込まれています。
  4. Image image = Image.FromStream(ms, true);:
    • Image.FromStreamメソッドを使用して、MemoryStreamから画像を生成しています。ここで、trueパラメータはストリーム内のデータが画像の元データであることを示します。
  5. return image;:
    • 最後に、生成されたImageオブジェクトを返します。この画像は、元のBase64文字列から復元されたものです。

ファイルとBase64

ファイルをBase64に変換することで、テキストとして保存や送信が可能になります。これは様々な種類のファイルに対応しています。

ファイルをBase64にエンコード

public string FileToBase64(string filePath)
{
    byte[] fileBytes = File.ReadAllBytes(filePath);
    string base64String = Convert.ToBase64String(fileBytes);
    return base64String;
}
  1. byte[] fileBytes = File.ReadAllBytes(filePath);:
    • この行では、File.ReadAllBytesメソッドを使用して指定されたファイルパスfilePathからファイルの内容をバイト配列fileBytesとして読み込んでいます。
    • ReadAllBytesメソッドは、ファイルのすべての内容を一度にメモリに読み込みます。このメソッドは非常に大きなファイルには適していない場合があるので、ファイルサイズに注意する必要があります。
  2. string base64String = Convert.ToBase64String(fileBytes);:
    • ここで、読み込んだバイト配列fileBytesをBase64エンコーディングに変換しています。
    • Convert.ToBase64Stringメソッドは、バイト配列をBase64形式の文字列に変換します。Base64は、バイナリデータをASCII文字列として表現するためのエンコーディング方式です。
  3. return base64String;:
    • 最後に、Base64エンコードされた文字列base64Stringを返します。

Base64からファイルへのデコード

public void Base64ToFile(string base64String, string filePath)
{
    byte[] fileBytes = Convert.FromBase64String(base64String);
    File.WriteAllBytes(filePath, fileBytes);
}
  1. byte[] fileBytes = Convert.FromBase64String(base64String);:
    • この行では、Base64エンコードされた文字列base64Stringをバイト配列にデコードしています。
    • Convert.FromBase64Stringメソッドは、Base64文字列を対応するバイト配列に変換します。この操作により、Base64でエンコードされたデータが元のバイナリ形式に戻されます。
  2. 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("=", "");
}
  1. string base64 = Convert.ToBase64String(input);:
    • この行では、バイト配列inputをBase64エンコーディングに変換しています。Convert.ToBase64Stringメソッドは、バイト配列をBase64形式の文字列に変換します。
  2. // URLセーフな文字列に変換:
    • このコメントは、次の処理がBase64エンコーディングされた文字列をURLセーフな形式に変換することを示しています。
  3. return base64.Replace("+", "-").Replace("/", "_").Replace("=", "");:
    • ここで、Base64エンコーディングされた文字列base64をURLで安全に使用するために変更しています。
    • Base64エンコーディングは、通常+/=といった文字を含むことがありますが、これらの文字はURLで特別な意味を持つため、URLでの使用に適していません。
    • .Replace("+", "-").Replace("/", "_")は、Base64文字列中の+/をそれぞれ-_に置き換えています。これにより、URL内で安全に使用できる文字列に変換されます。
    • .Replace("=", "")は、Base64エンコーディングのパディング文字=を取り除いています。URL内での使用には必要ないため、削除することが一般的です。

まとめ

この記事では、C#でBase64エンコーディングとデコーディングを行う方法を様々な観点から解説しました。画像やファイルの扱い、URLセーフなエンコーディングなど、C#でのBase64操作は非常に多様で便利です。これらの知識を活用して、より効果的なプログラムを作成しましょう。

広告
【C#】
広告
タイトルとURLをコピーしました