Python将字符串“1001101”写为文件的二进制流

时间:2013-11-23 17:47:56

标签: python string file binary output

我有一个非常长的字符串,即1&0和#0。它是关于12个32位汇编指令。我想将此流写入.bin文件...但我不希望它是ASCII格式。我只想将1和0写入文件。知道如何转换它并使用.write来实现这一目标吗?谢谢!

2 个答案:

答案 0 :(得分: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,您可以指定字节顺序,>I为big-endian 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 :(得分: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.bin,或者cat,则显示以下内容:

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

事实上,这是人类可读的文字是正确的。纯粹的巧合是原始比特流可以解释为ASCII。尽管如此,它还是二元的。