C# byte[] と string の相互変換

C#

stringからbyte[]への変換

C#
using System.Text;
using System.Text.Unicode;

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
string originalString = "こんにちは、C#!";

// UTF-8エンコーディングを使用
byte[] utf8Bytes = Encoding.UTF8.GetBytes(originalString);
Console.WriteLine("UTF-8 Bytes: " + BitConverter.ToString(utf8Bytes));

// UTF-16 (Unicode) エンコーディングを使用
// GetBytes() のデフォルトはUTF-16LE(リトルエンディアン)
byte[] utf16Bytes = Encoding.Unicode.GetBytes(originalString);
Console.WriteLine("UTF-16 Bytes: " + BitConverter.ToString(utf16Bytes));

// UTF-16 (Unicode) エンコーディングでビッグ・エンディアン
byte[] bigEndianUtf16Bytes = Encoding.BigEndianUnicode.GetBytes(originalString);
Console.WriteLine("UTF-16 Bytes(Big Endian): " + BitConverter.ToString(bigEndianUtf16Bytes));

// ASCIIエンコーディングを使用
byte[] asciiBytes = Encoding.ASCII.GetBytes(originalString);
Console.WriteLine("ASCII Bytes: " + BitConverter.ToString(asciiBytes));

// Shift-JISエンコーディングを使用 (Windows環境)
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
try
{
    // Shift-JISを扱うにはCodePagesEncodingProviderの登録が必要
    Encoding shiftJIS = Encoding.GetEncoding("Shift_JIS");
    byte[] shiftJISBytes = shiftJIS.GetBytes(originalString);
    Console.WriteLine("Shift-JIS Bytes: " + BitConverter.ToString(shiftJISBytes));
}
catch (NotSupportedException ex)
{
    Console.WriteLine($"Shift-JISエンコーディングがサポートされていません: {ex.Message}");
}

文字列をバイト配列に変換するにはエンコードを指定します。

  • Encoding.UTF8.GetBytes(string): UTF-8でバイト配列を取得します。
  • Encoding.Unicode.GetBytes(string): UTF-16 (リトルエンディアン) でバイト配列を取得します。
  • Encoding.ASCII.GetBytes(string): ASCIIでバイト配列を取得します。ASCIIは文字の範囲が限られているため、日本語などのマルチバイト文字を含む文字列では文字化けが発生する可能性があります。
  • Encoding.GetEncoding("エンコーディング名").GetBytes(string): 特定のエンコーディング名(例: “Shift_JIS”, “EUC-JP”など)を指定してバイト配列を取得します。

Windows環境におけるShift_JIS など一部のエンコーディングは、デフォルトではサポートされていません。これらのエンコーディングを使用するには、System.Text.Encoding.CodePages NuGet パッケージをインストールし、アプリケーションの起動時に Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); を呼び出す必要があります。

ただし、.NET Coreで.NET 8 以降であればSystem.Text.Encoding.CodePages のインストールは必要ありませんが、Encoding.RegisterProviderの呼び出しは必要です。

byte[] から string への変換

文字列をバイト配列に変換したものを、元の文字列に戻します。

元エンコードを正確に指定する必要があります。元の stringbyte[] に変換した際に使用したエンコーディングと同じものを指定しないと、文字化けが発生します。

C#
using System.Text;

string originalString = "こんにちは、C#";

// UTF-8のbyte[]を文字列にデコード
byte[] utf8Bytes = Encoding.UTF8.GetBytes(originalString);
string decodedStringFromUtf8 = Encoding.UTF8.GetString(utf8Bytes);
Console.WriteLine($"UTF-8からのデコード: {decodedStringFromUtf8}");

// UTF-16のbyte[]を文字列にデコード
byte[] utf16Bytes = Encoding.Unicode.GetBytes(originalString);
string decodedStringFromOriginalUtf16 = Encoding.Unicode.GetString(utf16Bytes);
Console.WriteLine($"元のUTF-16からのデコード: {decodedStringFromOriginalUtf16}");

// Shift-JISエンコーディングでデコード
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
try
{
    Encoding shiftJIS = Encoding.GetEncoding("Shift_JIS");
    byte[] shiftJISBytesExample = shiftJIS.GetBytes("テストシフトJIS"); // テスト用のShift-JISバイト配列
    string decodedStringFromShiftJIS = shiftJIS.GetString(shiftJISBytesExample);
    Console.WriteLine($"Shift-JISからのデコード: {decodedStringFromShiftJIS}");
}
catch (NotSupportedException ex)
{
    Console.WriteLine($"Shift-JISエンコーディングはサポートされていません: {ex.Message}");
}

  • Encoding.UTF8.GetString(byte[]): UTF-8でバイト配列を文字列に変換します。
  • Encoding.Unicode.GetString(byte[]): UTF-16 (リトルエンディアン) でバイト配列を文字列に変換します。
  • Encoding.ASCII.GetString(byte[]): ASCIIでバイト配列を文字列に変換します。
  • Encoding.GetEncoding("エンコーディング名").GetString(byte[]): 特定のエンコーディング名(例: “Shift_JIS”, “EUC-JP”など)を指定してバイト配列を文字列に変換します。

Windows環境でシフトJISを扱う場合には、やはり Encoding.RegisterProvider の呼び出しが一度だけ必要です。

string を byte[] に変換する際に使用したエンコーディングと、その byte[] を string に戻す際に使用するエンコーディングは必ず一致している必要があります。エンコーディングが異なると、データが破損したり、文字化けが発生したりします。

コメント

タイトルとURLをコピーしました