2013-11-23 67 views
0

我有一个非常长的字符串,它是1和0的。它大约有12个32位汇编指令。我想写这个流到一个.bin文件...但我不希望它是ASCII格式。我只想将1和0写入文件。任何想法如何转换并使用.write来完成这个?谢谢!Python将字符串“1001101”作为二进制流写入文件

+0

没有bin文件是ASCII格式。但是,如果在文本编辑器中打开bin文件,肯定会出现一些可读的字符,因为编辑器将字节解释为ASCII字符。数字32和空格之间基本上没有区别。这只是你看待它的方式。在你的情况下,“1001101”将显示为“M”。 – Hyperboreus

+2

使用[struct](http://docs.python.org/2/library/struct.html) – dawg

回答

3

看来你需要struct

import struct 
import numpy as np # for random string of ones and zeros 

def chunks(s): 
    for i in xrange(0, len(s), 32): 
     yield s[i:i+32] 

s = ''.join(str(np.random.randint(2)) for x in xrange(32*2)) 
ints = (int(x, 2) for x in chunks(s)) # convert string from binary repr to integers 
bins = (struct.pack('I', i) for i in ints) # pack to unsigned ints 

输出:

>>> s 
'0000000000011111011101011001010111000000010110111100111110001001' 
>>> ''.join(bins) 
'\x95u\x1f\x00\x89\xcf[\xc0' 

注意I格式是本机格式unsigned int类型,你可以指定字节顺序expicetely,与>I是大端int32和<I little-endian(注意倒序的4字节序列):

>>> bi_bins = (struct.pack('>I', i) for i in ints) 
>>> ''.join(bi_bins) 
'\x00\x1fu\x95\xc0[\xcf\x89' 
+1

我正准备回答我自己的问题......但你也是这么做的。你的问题有一个,它需要转换成大端。我在输出上用xxd检查过它,它工作。感谢你的回答!这是我的代码工作。 'i = 0 while i Diesel

+0

@ user2304751是的,我没有提到字节顺序,并且即将编辑我的答案,但你评论得更快:)我将添加这个以供进一步参考。 – alko

+2

@alko它是“endian”,而不是“印度人”。与大次大陆的公民没有任何关系。这个词源于格列佛的旅行,因为关于如何去除蛋的问题存在争议:在大的一端或在小端。因此,“大端”和“小端”。一,二,三,四,五个小端。 – Hyperboreus

1

这是如何在你的二进制字符串写入文件,假设它是在32位整数,并假设它使用系统的本机字节序:

#! /usr/bin/python3.2 

import struct 

b = '011011100010000001101110010010010010000001100001011101100110111101110100011100100110010101100110011010010110111001100001001000000010000001110011011101010110110101100001011101000111010101101101001000000111001101100001011101000110010101100011011010010110010001100110001000000110010101110010011000010110110101110010011011110010111000101110001011100111001100101110001011100010111000101110' 

with open ('out.bin', 'wb') as f: 
    while b: 
     int32 = int (b [:32], 2) 
     b = b [32:] 
     f.write (struct.pack ('I', int32)) 

关于您的ASCII关注

如果您在文本编辑器,或者打开输出文件out.bincat呢,下面显示出来:

$ cat out.bin 
In nova fert animus mutatas dicere formas....... 

事实上,这是人类可读的文本是好的,适当的。原来的比特流可以解释为ASCII是纯粹的巧合。它是二元的。