Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:由1和0组成的字符串->;二进制文件_Python_Binary - Fatal编程技术网

Python:由1和0组成的字符串->;二进制文件

Python:由1和0组成的字符串->;二进制文件,python,binary,Python,Binary,我在Python中有一个由1和0组成的字符串,我想将其写入一个二进制文件。我很难找到一个好方法来做这件事 有没有一个标准的方法可以做到这一点,而我只是错过了 In [1]: int('10011001',2) Out[1]: 153 将您的输入拆分为八位,然后应用int(\u2)和chr,然后连接成一个字符串并将该字符串写入文件 类似于…: your_file.write(''.join(chr(int(your_input[8*k:8*k+8], 2)) for k in xrange(le

我在Python中有一个由1和0组成的字符串,我想将其写入一个二进制文件。我很难找到一个好方法来做这件事

有没有一个标准的方法可以做到这一点,而我只是错过了

In [1]: int('10011001',2)
Out[1]: 153
将您的输入拆分为八位,然后应用
int(\u2)
chr
,然后连接成一个字符串并将该字符串写入文件

类似于…:

your_file.write(''.join(chr(int(your_input[8*k:8*k+8], 2)) for k in xrange(len(your_input)/8)))

如果你想要一个二进制文件

>>> import struct
>>> myFile=open('binaryFoo','wb')
>>> myStr='10010101110010101'
>>> x=int(myStr,2)
>>> x
76693
>>> struct.pack('i',x)
'\x95+\x01\x00'
>>> myFile.write(struct.pack('i',x))
>>> myFile.close()
>>> quit()

这就是您要找的吗?

或者您可以像这样使用
阵列
模块

BITS_IN_BYTE = 8
chars = '00111110'
bytes = bytearray(int(chars[i:i+BITS_IN_BYTE], 2)
    for i in xrange(0, len(chars), BITS_IN_BYTE))
open('filename', 'wb').write(bytes)
$ python
Python 2.7.2+ (default, Oct  4 2011, 20:06:09) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import random,array
#This is the best way, I could think of for coming up with an binary string of 100000 
>>> binStr=''.join([str(random.randrange(0,2)) for i in range(100000)]) 
>>> len(binStr)
100000
>>> a = array.array("c", binStr)
#c is the type of data (character)
>>> with open("binaryFoo", "ab") as f:
...     a.tofile(f)
... 
#raw writing to file
>>> quit()
$ 

现在有一个位字符串模块,可以满足您的需要

from bitstring import BitArray

my_str = '001001111'
binary_file = open('file.bin', 'wb')
b = BitArray(bin=my_str)
b.tofile(binary_file)
binary_file.close()

您可以在Linux的shell中使用
xxd-b file.bin

测试myStr的可能值限制非常低('i'格式需要-2147483648@oxtopus,同意范围有限。但你有什么其他建议?@oxtopus同意没有足够的信息,但我们似乎都介意以同样的方式阅读OP…:)很接近,但我的情况下myStr真的很大-大约100000长。所以我得到一个错误,因为“参数超出范围。”我可以使用长度为31的缓冲区(sorta)来解决这个问题,但这不太正确-我的文件大小最终比它应该的大一点。将我的字符串切分为长度为32的子字符串会再次出现“参数超出范围”错误。想法?我们不是通灵者;你必须显示(可能是在一个新问题中)您是如何“将字符串切分为长度为32的子字符串”并处理结果的。标准方法是永远不要在“1”和“0”的字符串中进行通信。这些字符串从何而来?没有“二进制文件”这样有意义的东西。所有文件都是“二进制”文件;它们包含位序列。听起来您的意思是“我想将字符串中的每个“1”和“0”字符解释为单个位,将8位的集合分组为字节,然后将结果写入文件”.@KarlKnechtel.当然,是的,这是我想做的。但是当我尝试这样做时,我会出错,就像下面liori建议的那样。我已经在下面解释了这个问题。@Russellborogve。我同意,这很糟糕,但这是一个课程的作业。我希望我有选择。:)这就是我试图做的,但是当我试图写字符串时,我得到了一个UnicodeEncodeError。显然,这是因为字符串中有一些ascii不支持的字符-但是chr()的doc说它只返回ascii字符。想法?@sevandyk:是python 3吗?你的0和1字符串实际上是一个unicode对象吗?你是否以二进制模式打开文件(
open(…,'wb')
)?哪个包包含位字符串?我试图安装它,但出现错误“以下包无法从当前频道获得”
from bitstring import BitArray

my_str = '001001111'
binary_file = open('file.bin', 'wb')
b = BitArray(bin=my_str)
b.tofile(binary_file)
binary_file.close()