将由1和0组成的字符串转换为字节数组

5
我有一个长度为8的倍数的字符串,其中只包含0和1。我想将该字符串转换为适合写入文件的字节数组。例如,如果我有字符串“0010011010011101”,我想得到字节数组[0x26,0x9d],当写入文件时,它将给出0x269d作为二进制(原始)内容。
在Python中,我该怎么做?

[0x26, 0x9d] 实际上不是一个字节数组。它是一个包含两个整数的列表(在内部,这些整数是4字节有符号值)。您是指实际的字节还是整数?请澄清您的问题。 - S.Lott
我该如何将所需的结果写成字节数组而不是整数数组? - Chris Lieb
一系列字节可以是字符串('&\x9d'),也可以是实际数组(array.array('B',[0x26, 0x9d]))。许多人在指代列表、元组或者类似字符串的某些其他序列时说“数组”。或者他们可能指的是“数组”这个单独的库。 - S.Lott
1
抱歉,我已经编写Python两天了,所以还没有掌握它的术语。我的意思是希望得到一个东西,当写入文件时,会生成一个二进制内容为0x269d的文件。 - Chris Lieb
请看我的回复。您需要将字符串写入文件,不支持写入数组。 - Martin v. Löwis
显示剩余2条评论
4个回答

6
你可以这样做:
>>> s = "0010011010011101"
>>> [int(s[x:x+8], 2) for x in range(0, len(s), 8)]
[38, 157]

如果我将这些整数写入文件,它们只会使用所需的字节,还是会占用整个int的大小(4个字节,我想)? - Chris Lieb

6
py> data = "0010011010011101"
py> data = [data[8*i:8*(i+1)] for i in range(len(data)/8)]
py> data
['00100110', '10011101']
py> data = [int(i, 2) for i in data]
py> data
[38, 157]
py> data = ''.join(chr(i) for i in data)
py> data
'&\x9d'

int('0010011010011101', 2) 单独可能已经足够满足原帖作者的需求。 - user3850

4
你的问题展示了一系列整数,但同时提到“字节数组”,并且说“写入文件时将以0x269d作为二进制(原始)内容”。这三个概念是非常不同的。我认为你过度指定了。从你的各种评论中可以看出,你只想要文件输出,其他描述并不是你想要的。
如果你想要一个整数序列,请参考Greg Hewgill的答案。
如果你想要一个字节序列(如字符串)——可以写入文件——请参考Martin v. Löwis的答案。
如果你想要一个字节数组,你必须这样做。
import array
intList= [int(s[x:x+8], 2) for x in range(0, len(s), 8)]
byteArray= array.array('B', intList)

字节序列正是我在寻找的。感谢您的帮助。 - Chris Lieb

0

Python 3 和 number.to_bytes

使用 Python 3,您可以使用 number.to_bytes 将数字本地转换为字节。字节数组可以直接写入文件。

>>> import math,sys
>>> s='0010011010011101'
>>> int(s,2).to_bytes(math.ceil(len(s)/8),sys.byteorder)
b'\x9d&'
>>> with open('/tmp/blah', 'wb') as f:
...     f.write(int(s,2).to_bytes(math.ceil(len(s)/8),sys.byteorder))
... 
2
>>> quit()

文件内容

[root@localhost prbs]# od -x /tmp/blah
0000000 269d
0000002

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接