C#で数値や文字列をバイト配列に変換する

C#

数値や文字列をバイナリファイルに書き出す場合なと、値をバイト配列へ変換したい場合もあると思います。
数値や文字列からバイト配列へ変換する方法について解説します。


数値をバイト配列に変換

数値をバイト配列に変換するにはSystem.BitConverterクラスのGetBytesメソッドを使います。
変換したいデータ型をいろいろ渡せてbyte配列を取得することができます。

メソッド
byte[] GetBytes(bool value)
byte[] GetBytes(char value)
byte[] GetBytes(short value)
byte[] GetBytes(int value)
byte[] GetBytes(long value)
byte[] GetBytes(ushort value)
byte[] GetBytes(uint value)
byte[] GetBytes(ulong value)
byte[] GetBytes(float value)
byte[] GetBytes(double value)
    int number = 1234567;
    byte[] data = BitConverter.GetBytes(number);  //data=0x87, 0xd6, 0x12, 0x00


バイト配列の並び順(エンディアン)

数値データをバイト配列としてどのような順番で格納するかという決まりには、リトルエンディアンとビッグエンディアンという2つの種類があります。

上記の例を見てみましょう。
「1234567」という数値は16進数で表すと「0x0012D687」となりますが、バイト配列には下位のバイトから格納されていることが分かります。このように下位バイトから格納していく方法はリトルエンディアンと呼ばれ、逆に上位バイトから格納していく方法はビッグエンディアンと呼ばれます。

Windowでは通常リトルエンディアンが使われますが、バイト配列にはビッグエンディアンで格納されているケースもあるでしょう。そのような場合はSystem.ArrayクラスのReverseメソッドで順番を逆にしてから変換しましょう。

  byte[] data = { 0x00, 0x12, 0xd6, 0x87 };
  Array.Reverse(data);
  int number = BitConverter.ToInt32(data, 0);  //number=1234567



文字列をバイト配列に変換

バイト配列を文字列に変換する場合は文字コードに注意する必要があります。
System.Text.EncodingクラスのGetBitesメソッドを使って変換しましょう。

文字コードUTF-8のバイト配列を生成した場合は以下のような使い方になります。

    var encoding = Encoding.GetEncoding("UTF-8");
    var data = encoding.GetBytes("あいうえお");



文字コードShift-JISでバイト配列を生成した場合は以下のようになります。

    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

    var encoding = Encoding.GetEncoding("Shift-JIS");
    var data = encoding.GetBytes("あいうえお");


※使用するフレームワークが.NET Framework系の場合は1行目は必要ありませんでしたが、.NET Core系では1行目の指定が必要になりました。Shift-JISのエンコーディングプロバイダがデフォルトで登録されなくなったようです。
1行目の登録は1度行えばプログラム終了まで有効です。
参照の追加でSystem.Text.Encoding.CodePages.dllの追加が必要になるかもしれません。


コメント