2011年3月16日水曜日

10進・16進[文字列]の変換(バイナリデータからアスキーテキストへの変換)

10進数字から16進文字列への変換(1234 → "04 D2")、
16進文字列から10進数字への変換("04 02" → 1234)、
を行う例題です。

16進数のデータはchar型データの文字列として扱います。
バイナリエディタなどでは、char 型で扱われる 0〜255 までの文字を1バイトずつ printf にて %x 形式で出力すれば良い話です。
一方古い通信機器等では、通信を行う際の形式がアスキー形式かつ1バイト(char)を変換した "AA" ではなく、2バイト(short)、4バイト(int)等の場合があり、一文字のデータを送る場合にも "000000AA" のように "00" 文字を埋めた形のアスキーテキストを送る必要があります。
また、そのアスキーデータを受信した後にバイナリデータとして変換する必要があります。

例題では、バイナリダンプで行うような1バイトずつの16進文字列への変換と、変換するバイト数(1バイト・8バイト)を指定した変換を行っています。
バイナリダンプを行うような場合は、hexdump/dump2char 関数のみを参考にしてください。

バイト数を指定する例ではバイトオーダーを考慮し、リトルエンディアン[最下位のバイト順](Intel) の並びで変換が行われた結果が表示されています(Intel OSX)。
バイトオーダーの違いによるバイト列の並びは以下のようなものです。
例:2バイト(16ビット)の数値(1)
ビッグエンディアン  00000000 00000001  (Byte4:Byte3:Byte2:Byte1)
リトルエンディアン  00000001 00000000  (Byte1:Byte2:Byte3:Byte4)

実行結果

0 件のコメント:

コメントを投稿