バイナリファイルを読み込んだりネットワークからダウンロードしたデータを扱う場合など、バイト配列として取得したデータを数値や文字列へ変換したい場合があります。
バイト配列から数値や文字列へ変換する方法について解説します。
バイト配列を数値に変換
バイト配列を数値に変換するにはSystem.BitConverterクラスを使います。
変換したいデータ型に合わせて以下のようなメソッドが用意されています。
| 変換したい型 | メソッド |
| bool | ToBoolean(byte[] value, int startIndex) |
| char | ToChar(byte[] value, int startIndex) |
| short | ToInt16(byte[] value, int startIndex) |
| int | ToInt32(byte[] value, int startIndex) |
| long | ToInt64(byte[] value, int startIndex) |
| ushort | ToUInt16(byte[] value, int startIndex) |
| uint | ToUInt32(byte[] value, int startIndex) |
| ulong | ToUInt64(byte[] value, int startIndex) |
| float | ToSingle(byte[] value, int startIndex) |
| double | ToDouble(byte[] value, int startIndex) |
byte[] data = { 0x87, 0xd6, 0x12, 0x00 };
int number = BitConverter.ToInt32(data, 0); //number=1234567
バイト配列の並び順(エンディアン)
数値データをバイト配列としてどのような順番で格納するかという決まりには、リトルエンディアンとビッグエンディアンという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クラスを使って変換します。
バイト配列に格納されたデータの文字コードがUTF-8の場合は以下のような使い方になります。
byte[] data = { 0xE3, 0x81, 0x82, 0xE3, 0x81, 0x84, 0xE3, 0x81, 0x86, 0xE3, 0x81, 0x88, 0xE3, 0x81, 0x8A };
var encoding = Encoding.GetEncoding("UTF-8");
var text = encoding.GetString(data); //text=あいうえお
バイト配列に格納されたデータの文字コードがShift-JISの場合は以下のようになります。
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
byte[] data = { 0x82, 0xA0, 0x82, 0xA2, 0x82, 0xA4, 0x82, 0xA6, 0x82, 0xA8 };
var encoding = Encoding.GetEncoding("Shift-JIS");
var text = encoding.GetString(data); //text=あいうえお
※使用するフレームワークが.NET Framework系の場合は1行目は必要ありませんでしたが、.NET Core系では1行目の指定が必要になりました。Shift-JISのエンコーディングプロバイダがデフォルトで登録されなくなったようです。
1行目の登録は1度行えばプログラム終了まで有効です。
参照の追加でSystem.Text.Encoding.CodePages.dllの追加が必要になるかもしれません。

コメント
コメントを投稿