1

16 進数で表示する必要があるバイナリ ファイルがあります。コードは次のとおりです。

file=open('myfile.chn','rb')  
for x in file:     
    i=0
    while i<len(x):
        print ("%0.2X"%(x[i]))
        i=i+1
        if (i>=10): 
            i=0
            break
file.close()

そして結果は次のようになります:

FF  
FF  
01  
00  
01  
00  
35  
36  
49  
EC      
.   
.   
. 

次のように結果を表示するには、コードのどの部分を変更する必要がありますか?

FF FF 01 00 01   
00 35 36 49 EC  
.  
.  

(各バイト間にスペースあり)

4

3 に答える 3

3

私が使用する要素は10個しかないので:

print(" ".join("%0.2X" % s for s in x[:10]))

または、行全体を含めたい場合:

print(" ".join("%0.2X" % s for s in x))

初期バージョンのバグがまだ残っています。入力は、1 行に 1 つの文字列として読み取られます。型変換 "%0.2X" は失敗します ("%s" は機能します)。行ごとにバイナリファイルを読み取ることはできないと思います。\n は単なる別のバイトであり、改行として解釈できません。

int 値のシーケンスがある場合、group メソッドを使用して n 要素のパーティションを作成できます。group メソッドはitertools recipiesにあります。

from itertools import zip_longest

def grouper(n, iterable):
    args = [iter(iterable)] * n
    return zip_longest(fillvalue=None, *args)

width=10
x = range(1,99)
for group in grouper(width, x):
    print((" ".join("%0.2X" % s for s in group if s)))

出力:

01 02 03 04 05 06 07 08 09 0A
0B 0C 0D 0E 0F 10 11 12 13 14
15 16 17 18 19 1A 1B 1C 1D 1E
1F 20 21 22 23 24 25 26 27 28
29 2A 2B 2C 2D 2E 2F 30 31 32
33 34 35 36 37 38 39 3A 3B 3C
3D 3E 3F 40 41 42 43 44 45 46
47 48 49 4A 4B 4C 4D 4E 4F 50
51 52 53 54 55 56 57 58 59 5A
5B 5C 5D 5E 5F 60 61 62

bytes_from_file には、バイトを generator として読み込みます:

def bytes_from_file(name):
    with open(name, 'rb') as fp:
        def read1(): return fp.read(1)
        for bytes in iter(read1, b""):
            for byte in bytes:
                yield byte

x = bytes_from_file('out.fmt') #replaces x = range(1,99)
于 2012-05-03T09:00:02.407 に答える
1

これでうまくいくはずです。

for i, x in enumerate(file):
    print ("%0.2X" % (x)),
    if i > 0 and i % 5 == 0:
        print
于 2012-05-03T08:49:35.333 に答える
0
file=open('myfile.chn','rb')  
for x in file:

       char=0
       i=0
       while i<len(x):
           print ("%0.2X "%(x[i])),
           char += 1
           if char == 5:
               char=0
               print ''
           i=i+1
           if (i>=10): 
               i=0
               break
file.close()
于 2012-05-03T08:49:53.133 に答える