Python中的字节数组


78

如何在Python中表示字节数组(如Java中的byte [])?我需要使用gevent通过电线发送它。

byte key[] = {0x13, 0x00, 0x00, 0x00, 0x08, 0x00};

Answers:


80

在Python 3中,我们使用bytes对象,str在Python 2中也称为。

# Python 3
key = bytes([0x13, 0x00, 0x00, 0x00, 0x08, 0x00])

# Python 2
key = ''.join(chr(x) for x in [0x13, 0x00, 0x00, 0x00, 0x08, 0x00])

我发现使用该base64模块更方便...

# Python 3
key = base64.b16decode(b'130000000800')

# Python 2
key = base64.b16decode('130000000800')

您还可以使用文字...

# Python 3
key = b'\x13\0\0\0\x08\0'

# Python 2
key = '\x13\0\0\0\x08\0'

9
作为记录,base64.b16decode(x)您可以简单地使用代替x.decode("hex")。它至少可以减少一分导入。:)
Dolda2000

32

只需使用bytearray(Python 2.6和更高版本)代表可变的字节序列即可

>>> key = bytearray([0x13, 0x00, 0x00, 0x00, 0x08, 0x00])
>>> key
bytearray(b'\x13\x00\x00\x00\x08\x00')

索引获取并设置单个字节

>>> key[0]
19
>>> key[1]=0xff
>>> key
bytearray(b'\x13\xff\x00\x00\x08\x00')

并且如果您需要它str(或bytes在Python 3中),它就像

>>> bytes(key)
'\x13\xff\x00\x00\x08\x00'

使用3.x并不是那么简单;fubar = str(key); print(len(key), len(fubar))产生6 38。在任何情况下(1)“字符串”都是非常模糊的术语(2)如果他想要可变性,则可以更改其原始列表
John Machin

@John:关于在Python 3中进行str不同工作的要点bytearray-已修复。我提到可变性主要是为了将其与区别开来bytes,但重点还在于,您根本不需要中间步骤来存储数据list
Scott Griffiths

2
OP真正需要的是这样一个公平的机会struct.pack("<IH", 19, 8)……
John Machin

6

另一种替代方法还具有轻松记录其输出的附加好处:

hexs = "13 00 00 00 08 00"
logging.debug(hexs)
key = bytearray.fromhex(hexs)

允许您进行简单的替换,如下所示:

hexs = "13 00 00 00 08 {:02X}".format(someByte)
logging.debug(hexs)
key = bytearray.fromhex(hexs)

3

Dietrich的答案可能仅仅是您需要描述的内容,即发送字节,但是例如,与您提供的代码更类似的将使用该bytearray类型。

>>> key = bytearray([0x13, 0x00, 0x00, 0x00, 0x08, 0x00])
>>> bytes(key)
b'\x13\x00\x00\x00\x08\x00'
>>> 

1
适用于Python 2.5或更早版本,但bytearray如果需要字节数组,内置的方法确实是可行的。
Scott Griffiths

@TokenMacGuy:您的答案还需要另外2次编辑:(1)提到数组模块(2)bytearray('b', ...)不起作用。或者您可以删除它。
约翰·马钦

2
@约翰:谢谢,固定。将来,只需继续进行并自己进行修改即可。
SingleNegationElimination
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.