我有一个字符串,其长度是8的倍数,只包含0和1。我想将字符串转换为适合写入文件的字节数组。例如,如果我有字符串“0010011010011101”,我想得到字节数组[0x26,0x9d],当写入文件时,它将给出0x269d作为二进制(原始)内容。
我怎样才能在Python中执行此操作?
答案 0 :(得分:5)
你可以这样做:
>>> s = "0010011010011101"
>>> [int(s[x:x+8], 2) for x in range(0, len(s), 8)]
[38, 157]
答案 1 :(得分:4)
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'
答案 2 :(得分:4)
你的问题显示了一个整数序列,但是说“字节数组”并且还说“当写入文件时,将给出0x269d作为二进制(原始)内容”。这是三件非常不同的事情。我认为你已经过度指定了。从您的各种评论中看起来您只想要文件输出,而其他描述则不是您想要的。
如果你想要一系列整数,请看Greg Hewgill的答案。
如果你想要一个字节序列(如字符串中) - 可以写入文件 - 请看Martinv.Löwis的答案。
如果你想要一个字节数组,你必须这样做。
import array
intList= [int(s[x:x+8], 2) for x in range(0, len(s), 8)]
byteArray= array.array('B', intList)
答案 3 :(得分:0)
在 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