2013-07-12 65 views
0

我有一個看起來像這樣的列表:Python的十六進制文件寫入

['\x12', '\x13', '\x05', ... , '\xF2'] 

,我試圖把它寫到這樣一個二進制格式的文件:

00010010 
00010011 
00000101 
11110010 

這是什麼我現在做:

for dataLine in readData: 
    print int(binascii.hexlify(dataLine), 16) 

然後轉換成8位二進制像這樣:

def dobin(n): 
    digs = [] 

    while n > 0: 
     digs.append(str(n % 2)) 
     n /= 2 

    for x in range(len(digs), 8): 
     digs.append('0') 

    digs.reverse() 
    return ''.join(digs) 

有沒有簡單的方法將這些轉換爲二進制或更好的方式?

回答

1

這是應該的Python 2.6(或更高版本)工作的一個版本:

>>> data = ['\x12', '\x13', '\x05', '\xF2'] 
>>> [bin(ord(c))[2:].zfill(8) for c in data]                             
['00010010', '00010011', '00000101', '11110010'] 

所以寫這一個文件,我可能會做這樣的事情:

f = open('some_file', 'w') 
f.write('\n'.join(bin(ord(c))[2:].zfill(8) for c in data)) 
f.close() 

編輯:沒有意識到bin()在Python 2.5上不可用,您可以定義以下bin()函數來使其工作:

def bin(i): 
    s = [] 
    prefix = '0b' if i >= 0 else '-0b' 
    if i < 0: i = -i 
    while i: 
     s.append('1' if i & 1 else '0') 
     i = i >> 1 
    return prefix + (''.join(reversed(s)) if s else '0') 
+0

我不相信bin在2.5中可用...我得到一個名稱未定義的錯誤 – spizzak

+0

由於[文檔](http://docs.python.org/2/library/functions.html# bin)說:「2.6版本中的新功能」。但是由於OP沒有規定2.5作爲要求,所以改變答案可能會更容易,所以我會這樣做。 – abarnert

+0

我可以發誓我提到過 - 我的錯誤。謝謝回覆! – spizzak