C#

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

現在は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バイトです)

 

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