2012-05-03 69 views
1

我有一個二進制文件需要以十六進制顯示。代碼如下:水平排列十六進制

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 
. 
. 

(每個字節之間有一個空格)

+0

是否有一個原因,爲什麼你把每行只有10個元素? –

+0

是的,這只是一個例子。其實我需要每行32個元素= 16個字節。 – Smith

回答

3

如您只需要10元我會使用:

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

,或者如果你想包括整個行:

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

仍然有一個bug從你的初始版本。您的輸入被讀取爲每行一個字符串。類型轉換「%0.2X」失敗(「%s」起作用)。我認爲你無法讀取每行的二進制文件。 \ n只是另一個字節,不能被解釋爲換行符。

當你有一個int值序列時,你可以用group方法創建n個元素的分區。組方法在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讀取字節作爲發電機:

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) 
+0

我使用python 3.2。它似乎不工作 – Smith

+0

print - > print(...) –

+0

我有1行1600個元素,我想將它劃分爲每行16個元素,這意味着我將總共有100行。我怎樣才能做到這一點? – Smith

1

這應該這樣做。

for i, x in enumerate(file): 
    print ("%0.2X" % (x)), 
    if i > 0 and i % 5 == 0: 
     print 
+0

它有一個錯誤:TypeError:%X格式:一個數字是必需的,而不是字節 – Smith

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