現在はHTTPなどでテキストベースでの通信も容易に行えるようになってきていますが、通信に使用する電文やバイナリデータも多く使われます。
ただ、バイナリデータも当然「データ」なのでプログラム内で扱いやすいデータに変換する必要があります。
C#では、バイナリデータは主に「バイト配列(byte[])型」で取得されます。
このデータをプログラム内でよく使われている数値(intやlong)型や、文字列(string)型に変換するにはBitConverter(System.BitConverter)というクラスが便利です。
BitConverterクラス
BitConverterクラスは宣言でも”public static class BitConverter”となっている「スタティック型」ですので
使い方も
BitConverter bc = new BitConverter(); // <-- 使えません
といった実装はしません。
戻り値 BitConverter.メソッド名();
という方法で使用します。
バイト列を数値データに変換する
バイト列のデータを数値データに変換するときは、下記のようなメソッドを使います。
bool BitConverter.ToBoolean(byte[], int) char BitConverter.ToChar(byte[], int) double BitConverter.ToDouble(byte[], int) short BitConverter.ToInt16(byte[], int) int BitConverter.ToInt32(byte[], int) long BitConverter.ToInt64(byte[], int) float BitConverter.ToSingle(byte[], int)
符号なしの数値型の場合
ushort BitConverter.ToUInt16(byte[], int) uint BitConverter.ToUInt32(byte[], int) ulong BitConverter.ToUInt64(byte[], int)
第一引数のbyte[]は、変換元のバイト列ですが、第二引数のintは何かというと
「変換を行う先頭のインデックス」です。
なぜ「先頭のインデックス」しかないかというと、変換先の型は1つのデータ型なのでデータサイズは決まっています。
ですので、わざわざサイズを指定する必要はありません。
ただし、バイト列のサイズが不足していたりするとArgumentExceptionという例外が発生してしまいますのでご注意ください。
バイト列を文字列に変換する
BitConverterに用意されているメソッドは下記のようになっています。
string BitConverter.ToString(byte[]) string BitConverter.ToString(byte[], int) string BitConverter.ToString(byte[], int, int)
文字列に変換する。と言っても
byte[] b = new byte[4]; b[0] = (byte)'a'; b[1] = (byte)'b'; b[2] = (byte)'c'; b[3] = (byte)'d';
というバイト配列を作って、このBitConverterのToString()にかけても”abcd”という文字列にはなりません。
この’BitConverter.ToString()’というメソッドは、
「バイト配列内のバイトデータをを16進数の文字列にする」
メソッドであり、人間が思っている「文字列への変換」とはちょっと違います。上記のバイト配列をこの”で変換すると、取得できる文字列は”61-62-63-64″(←61から64というのはabcdの16進数の文字コード)です。
数値データをバイト列に変換する
BitConverterには、逆にデータをバイト列に変換するメソッドも用意されています。
byte[] BitConverter.GetBytes(bool) byte[] BitConverter.GetBytes(char) byte[] BitConverter.GetBytes(double) byte[] BitConverter.GetBytes(short) byte[] BitConverter.GetBytes(int) byte[] BitConverter.GetBytes(long) byte[] BitConverter.GetBytes(float)
取得されるバイト配列のサイズですが、変換元のデータ型のサイズの長さで返ります。
符号なしの数値型の場合
byte[] BitConverter.GetBytes(ushort) byte[] BitConverter.GetBytes(uint) byte[] BitConverter.GetBytes(ulong)
文字列をバイト列に変換する
実は、BitConverterクラスにstringをバイト配列に変換するメソッドは提供されていません。
なぜバイト配列と文字列の変換がBitConverterで提供されていないのかというと、文字列の場合、バイト列は「エンコード方式」によって決まります。
では、わざわざハードコーディングが必要なのかというと、そんなことはありません。
文字列とバイト列の変換
文字列とバイト配列の変換は、「エンコード方式」を取り扱うEncoding(System.Text.Encoding)のほうにあります。
System.Text.Encodingの使い方は、BitConverterとちょっと違うところがあります。
それは、Encodingの配下に「エンコードの種類」というものがあり、そのエンコードのオブジェクトから変換メソッドを呼び出します。
(ここでは文字列とバイト列の変換ですのでエンコードの詳細については割愛します)
例として、エンコードを「シフトJIS」とした場合の変換を書きます。
バイト列から(シフトJISで)文字列に変換する
string s = System.Text.Encoding.GetEncoding("shift-jis").GetString(b);
(シフトJISの)文字列をバイト列に変換する
byte[] b = System.Text.Encoding.GetEncoding("shift-jis").GetBytes("abcd");
取得したバイト列のサイズは、変換するエンコードによって変わってきます。(この例の場合は4バイトです)