1

我正在使用 python 2.7.3 中的 bytearray 类型并注意到这种奇怪的行为:

将整数参数传递给它的构造函数会创建一个大小等于用零字节填充的整数的字节数组:

>>> s = bytearray(15)
>>> s
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')

但是,如果我尝试使用我手动设置的字节创建一个字节数组,构造函数似乎会忽略/跳过我创建的一些字节

>>> s = bytearray(b'\x34\x78\x98\xFF\xFF')
>>> s
bytearray(b'4x\x98\xff\xff')

为什么会这样?这是一个错误吗?还是我错过了什么? python 文档不是很有启发性

4

2 回答 2

10

没有什么奇怪的事情发生,所有的字节都还在。放松!:)

混淆源于表示略微优化的事实:其值表示可打印字符的字节被打印为这些字符。这使得它们在输出中只使用一个字符而不是四个。

它正在做它所说的:

  • \x34是字符4,这就是缓冲区以 ' 4'开头的原因
  • \x78是字符x,这就是为什么在 ' x' 之后有一个 ' 4'
  • \x98\xff\xff都保持原样。

请注意,len(s)打印 5。

史诗般的图形表示:

    +---+---+------+------+------+
s = | 4 | x | \x98 | \xff | \xff |
    +---+---+------+------+------+
于 2012-11-06T12:34:13.657 回答
1

它按照文档应该做的那样做:

如果它是一个整数,则该数组将具有该大小,并将使用空字节进行初始化。

当你给它 15. 这正是它所做的。所以那里没什么奇怪的。

如果是字符串,还必须提供编码(以及可选的错误)参数;bytearray() 然后使用 str.encode() 将字符串转换为字节。

当你给它你的字符串时。您没有提供编码或错误参数,这会带来默认值。默认情况下\x34变为4\x78变为x. \x98并且\xFF在 ascii 中没有表示,因此保留为字节。

于 2012-11-06T12:37:24.230 回答