[an error occurred while processing this directive] [an error occurred while processing this directive] .NET TIPS:バイト列と数値を変換するには? - @IT
[an error occurred while processing this directive]
【@記事種別@】
[an error occurred while processing this directive]
バイト列と数値を変換するには?

.NET TIPS

バイト列と数値を変換するには?

遠藤 孝信
2003/07/04
デジタルアドバンテージ

 バイト列(byte型の要素からなる配列)と数値を相互に変換するためのメソッドは、BitConverterクラス(System名前空間)にまとめられている。

バイト列から16進数文字列への変換

 バイト列と数値との変換を示す前に、バイト列を16進数文字列に変換するBitConverterクラスのToStringメソッドをまず紹介しておこう。このメソッドは、次のサンプル・プログラムにある最初の出力例のように、バイト配列のすべての要素を、ハイフンで区切った2桁ずつの16進数文字列で表示する。ファイルや電文の内容を確認する場合などに手軽に使える便利なメソッドだ。

C#
// hexstr.cs

using System;

public class ToHexString {
  static void Main() {

    byte[] byteArray = {
      0, 1, 2, 10, 11, 12, (byte)'a', (byte)'b'};

    Console.WriteLine(BitConverter.ToString(byteArray));
    // 出力:00-01-02-0A-0B-0C-61-62

    for (int i = 0; i < byteArray.Length; i++) {
      Console.Write("{0:X2} ", byteArray[i]);
    }
    // 出力:00 01 02 0A 0B 0C 61 62
  }
}

// コンパイル方法:csc hexstr.cs
バイト列を16進数文字列で表示するC#のサンプル・プログラム(hexstr.cs)

hexstr.csのダウンロード

 なお、上記サンプル・プログラムの2番目の出力部分は、書式指定により値を16進数文字列として表示するノーマルな方法を示している。

数値からバイト列への変換

 さて、数値をバイト列へ変換するにはBitConverterクラスのstaticなメソッドであるGetBytesメソッドを使用する。例えばint型の整数値は32bitであるため、このメソッドの戻り値は、4つの要素からなるbyte型の配列となる。

C#
int i = 1;
byte[] byteArray = BitConverter.GetBytes(i);

 GetBytesメソッドにはたくさんのオーバーライドされたバージョンが用意されており、int、long、doubleなどの基本的な数値型の値をパラメータとして取ることができる。次のサンプル・プログラムは、そのうちのいくつかを使用した例を示したものだ。変換後のバイト配列は、先に述べたToStringメソッドを用いて16進数文字列として示している。

C#
// num2bytes.cs

using System;

public class NumToBytes {
  static void Main() {

    byte[] byteArray;

    int i = 1;
    byteArray = BitConverter.GetBytes(i);
    Console.WriteLine(BitConverter.ToString(byteArray));
    // 出力:01-00-00-00

    i = 0x12345678;
    byteArray = BitConverter.GetBytes(i);
    Console.WriteLine(BitConverter.ToString(byteArray));
    // 出力:78-56-34-12

    float f = i;
    byteArray = BitConverter.GetBytes(f);
    Console.WriteLine(BitConverter.ToString(byteArray));
    // 出力:B4-A2-91-4D

    double d = i;
    byteArray = BitConverter.GetBytes(d);
    Console.WriteLine(BitConverter.ToString(byteArray));
    // 出力:00-00-00-78-56-34-B2-41
  }
}

// コンパイル方法:csc num2bytes.cs
GetBytesメソッドにより数値をバイト配列に変換するC#のサンプル・プログラム(num2bytes.cs)

num2bytes.csのダウンロード

 ところで、2bytes以上のバイト幅を持つ値をバイト列として扱う場合には、その値のメモリ上での格納順序(エンディアンと呼ばれる)を意識しなければならない場合がある。上記サンプル・プログラムの2番目の出力で、0x12345678の変換結果が「12-34-56-78」とならずに、「78-56-34-12」となっているのは、x86アーキテクチャのPCが、各バイト値を最下位バイトから順に格納するリトル・エンディアンであるためだ。このため、ビッグ・エンディアンのシステムとデータをやりとりする場合などでは、Arrayクラス(System名前空間)のReverseメソッドなどを使用して、バイト配列の要素の順序を反転させるなどの処理が必要となることがある。

バイト列から数値への変換

 逆に、バイト列から数値への変換には、同じくBitConverterクラスに用意されているTo〜メソッドを利用すればよい。例えば、4つの要素からなるbyte型の配列をint型の値に変換するには、次のようにToInt32メソッドを利用する。

C#
byte[] byteArray = {1, 0, 0, 0};
int i = BitConverter.ToInt32(byteArray, 0);

 第2パラメータには、バイト配列の中で変換の対象となる部分の開始位置のインデックスを指定しなければならない。このパラメータにより、長いバイト配列から順に数値を切り出していくことができる。

 BitConverterクラスに用意されている各数値型に対応したメソッドと、変換対象となるバイト配列のサイズ、戻り値の型を次の表にまとめておく。

メソッド名 サイズ(bytes) 戻り値の型 戻り値の元の型
ToBoolean 1 bool Boolean構造体
ToChar 2 char Char構造体
ToInt16 2 short Int16構造体
ToInt32 4 int Int32構造体
ToInt64 8 long Int64構造体
ToSingle 4 float Single構造体
ToDouble 8 double Double構造体
ToUInt16 2 ushort UInt16構造体
ToUInt32 4 uint UInt32構造体
ToUInt64 8 ulong UInt64構造体
バイト配列を数値に変換するBitConverterクラスのメソッド

 なお、バイト列を「文字列」に変換する方法については、「TIPS:バイト列を文字列に変換するには?」でまとめている。

カテゴリ:クラス・ライブラリ 処理対象:バイト列
使用ライブラリ:BitConverterクラス(System名前空間)
使用ライブラリ:Arrayクラス(System名前空間)
関連TIPS:バイト列を文字列に変換するには?
[an error occurred while processing this directive]
[an error occurred while processing this directive]
[an error occurred while processing this directive]
[an error occurred while processing this directive]