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