ふにゃるんv2

もとは、http://d.hatena.ne.jp/Wacky/

16進数ダンプを行うコード断片

まぁ、色々と必要に駆られたので、16進数ダンプを行うコードを作ってみた。

#!/bin/env python
# -*- encoding: euc_jp -*-

"""
16進数ダンプするモジュール
"""

def dump(fs, start, count):
    """16進数ダンプ出力を行う
        \arg    fs      fileストリーム
        \arg    start   ダンプ開始位置
        \arg    count   ダンプ個数
    """
    fs.seek(start)
    
    for i in range(count):
        if (i % 16) == 0:
            line = "%08x : " % (start + i)
            asc = ""
        if ((i + 8) % 16) == 0:
            line = line + "- "
        v1 = fs.read(1)
        v2 = ord(v1)
        line = line + "%02x " % (v2)
        asc = asc + ['.', chr(v2)][chr(v2).isalnum()]
        if (i % 16) == (16 - 1):
            print line + ": " + asc
            line = None
    
    if line:
        for j in range(16 - (count % 16)):
            if ((i + j + 8) % 16) == 0:
                line = line + "- "
            line = line + "   "
        print line + ": " + asc

# debug only
def main():
    f = open("dump.py")
    dump(f, 0, 100)

if __name__ == "__main__":
    main()

誰か添削してもらえませんかね?このコード。もちっと うまく書けそうな気がするんだが、今一わかんないのと、周りに Python ハカーな人がいないので、相談できなひ…。


余談だけど、LinuxCygwinだと、こんな使い方も出来る。

In [1]: import dump as d

In [2]: f = open("/dev/mem")

In [3]: d.dump(f, 0, 100)
00000000 : 53 ff 00 f0 53 ff 00 f0 - c3 e2 00 f0 53 ff 00 f0 : S...S.......S...
00000010 : 53 ff 00 f0 54 ff 00 f0 - d4 e4 00 f0 53 ff 00 f0 : S...T.......S...
00000020 : a5 fe 00 f0 87 e9 00 f0 - 33 ff 00 f0 33 ff 00 f0 : ........3...3...
00000030 : 33 ff 00 f0 33 ff 00 f0 - 57 ef 00 f0 8f f6 00 f0 : 3...3...W.......
00000040 : 12 13 00 c0 4d f8 00 f0 - 41 f8 00 f0 70 2b dc ea : ....M...A...p...
00000050 : 39 e7 00 f0 59 f8 00 f0 - b2 85 00 f0 d2 ef 00 f0 : 9...Y...........
00000060 : 59 ff 00 f0                -                      : Y...