2007年03月18日

第4章 実践編1 メインフレームのデータの扱い(3) 〜16進数変換〜

 さて、次は16進数変換です。
'rb'でオープンしたファイルは文字列として読み込まれます。第9回で出てきたfor文、これを文字列に適用するとどうなるでしょう。
chstring.png

 1文字ではなく1バイトずつ読めていることがわかります。
 これを順番に16進数2桁で表していくことにしましょう。
 1バイトを16進数2桁で表すには、次のように書けばOKです。
'%02X' % ord(c)

ord(c)で、文字を数値にしてから、16進数2桁にフォーマットしています。

ordについてはライブラリリファレンスを見ると、「1 文字からなる文字列または Unicode 文字の ASCII 値を返します。」となっていて、何となくすっきりしません。念のため確認しておきましょう。さてどうすれば?
 こんな場合、「あたり」をつける良い方法があります。
Python ライブラリリファレンスの索引を眺めてみるのです。関係しそうな単語、"binary"、"asc"、"chr"などを追っていくと、
binary
     data, packing
というのがありました。この説明を読むと
「4.3 struct -- 文字列データをパックされたバイナリデータとして解釈する」となっていますので、これを使うことにしましょう。structは標準ライブラリにあるモジュールなので、使うためにはimport文を使って取り込む必要があります。
 というわけで、以下のコードを試してみれば1バイトにセットした0〜255の値をきちんと返しているかが確認できます。

import struct
for i in range(256):
    if i != ord(struct.pack('B', i)):
        print i

この結果は何も表示されませんので、安心して手軽なビルトイン関数であるordを使うことにしましょう。

 16進文字列への変換についても、同様にライブラリインデックスを眺めるとhex()という関数が見つかります。試してみると、1桁の場合'0x3'と返ってきますので、前ゼロをつけるよう、編集する必要があります。編集方法を調べるため、先ほどの「参考:」から「文字列フォーマット操作」へリンクしてみます。これを良く読めばhex()を使わなくても良いことがわかります。

>>> '%02X' % 15
'0F'
>>>
posted by ymd at 17:51| Comment(0) | TrackBack(0) | 第4章 実践編
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/3551203

この記事へのトラックバック