2013-07-12 54 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