C# バイト列(byte[])を変換する

   

現在はHTTPなどでテキストベースでの通信も容易に行えるようになってきていますが、通信に使用する電文やバイナリデータも多く使われます。
ただ、バイナリデータも当然「データ」なのでプログラム内で扱いやすいデータに変換する必要があります。

C#では、バイナリデータは主に「バイト配列(byte[])型」で取得されます。
このデータをプログラム内でよく使われている数値(intやlong)型や、文字列(string)型に変換するにはBitConverter(System.BitConverter)というクラスが便利です。

 

BitConverterクラス

BitConverterクラスは宣言でも”public static class BitConverter”となっている「スタティック型」ですので
使い方も

 

といった実装はしません。

 

という方法で使用します。

 

バイト列を数値データに変換する

バイト列のデータを数値データに変換するときは、下記のようなメソッドを使います。

 

符号なしの数値型の場合

第一引数のbyte[]は、変換元のバイト列ですが、第二引数のintは何かというと
「変換を行う先頭のインデックス」です。

なぜ「先頭のインデックス」しかないかというと、変換先の型は1つのデータ型なのでデータサイズは決まっています。
ですので、わざわざサイズを指定する必要はありません。
ただし、バイト列のサイズが不足していたりするとArgumentExceptionという例外が発生してしまいますのでご注意ください。

 

バイト列を文字列に変換する

BitConverterに用意されているメソッドは下記のようになっています。

 

文字列に変換する。と言っても

 

というバイト配列を作って、このBitConverterのToString()にかけても”abcd”という文字列にはなりません。

この’BitConverter.ToString()’というメソッドは、

「バイト配列内のバイトデータをを16進数の文字列にする」

メソッドであり、人間が思っている「文字列への変換」とはちょっと違います。上記のバイト配列をこの”で変換すると、取得できる文字列は”61-62-63-64″(←61から64というのはabcdの16進数の文字コード)です。

 

数値データをバイト列に変換する

BitConverterには、逆にデータをバイト列に変換するメソッドも用意されています。

 

取得されるバイト配列のサイズですが、変換元のデータ型のサイズの長さで返ります。

符号なしの数値型の場合

 

文字列をバイト列に変換する

実は、BitConverterクラスにstringをバイト配列に変換するメソッドは提供されていません。

なぜバイト配列と文字列の変換がBitConverterで提供されていないのかというと、文字列の場合、バイト列は「エンコード方式」によって決まります。
では、わざわざハードコーディングが必要なのかというと、そんなことはありません。

 

文字列とバイト列の変換

文字列とバイト配列の変換は、「エンコード方式」を取り扱うEncoding(System.Text.Encoding)のほうにあります。
System.Text.Encodingの使い方は、BitConverterとちょっと違うところがあります。
それは、Encodingの配下に「エンコードの種類」というものがあり、そのエンコードのオブジェクトから変換メソッドを呼び出します。
(ここでは文字列とバイト列の変換ですのでエンコードの詳細については割愛します)

例として、エンコードを「シフトJIS」とした場合の変換を書きます。

 

バイト列から(シフトJISで)文字列に変換する

 

(シフトJISの)文字列をバイト列に変換する

 

取得したバイト列のサイズは、変換するエンコードによって変わってきます。(この例の場合は4バイトです)

 

 - 未分類