.NET TIPS

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

デジタルアドバンテージ
2003/07/04

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

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

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

// 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)

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

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

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

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

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

// 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)

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

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

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

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:バイト列を文字列に変換するには?」でまとめている。End of Article

カテゴリ:クラス・ライブラリ 処理対象:バイト列
使用ライブラリ:BitConverterクラス(System名前空間)
使用ライブラリ:Arrayクラス(System名前空間)
関連TIPS:バイト列を文字列に変換するには?
 
この記事と関連性の高い別の.NET TIPS
文字列をシフトJISとしてバイト列に変換するには?
バイト列を文字列に変換するには?
文字列のバイト数を取得するには?
バイト配列→画像オブジェクト/画像オブジェクト→バイト配列の変換を行うには?
2進数文字列と16進数文字列を相互に変換するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

TechTargetジャパン

Insider.NET フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

キャリアアップ


- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る
- PR -

ホワイトペーパーTechTargetジャパン

ソリューションFLASH

「ITmedia マーケティング」新着記事

目立つ! 読まれる! ブログを作る4つのポイント
ブランドの認知度向上に向けて、ブログを活用している企業は多い。だが実際、あまたのブ...

VOYAGE GROUP、東京工業大学と産学連携 ―― アドテクノロジー分野のビッグデータ活用を共同研究
VOYAGE GROUPは4月17日、東京工業大学と産学連携し、アドテクノロジー分野におけるビッグ...

日本のメディアが進む道 ―― 朝日新聞メディアラボ、東洋経済オンライン、NHKのメディア戦略から読み解く
メディアは生き残れるのかといった議論が活発な昨今。テレビや新聞、雑誌などのマスメデ...