为什么Python的bytearray可以处理大于等于256的值?

4

Python中的bytearray文档指出:

bytearray类型是0 <= x < 256范围内的可变整数序列。

但是下面的代码表明值可以>= 256。我存储了一个最大值为:2 ^ 9-1 = 512-1 = 511的9位二进制数。

ba = bytes([0b111111111])
print '%s' % (ba)

9位二进制数以十进制511的形式打印出来。
[511]

我不知道预期的行为是什么,但我假设最高有效位会被舍弃以得到8位数字。


1
你正在使用哪个版本的Python?在你的例子中,代码在3.3.1中会给出一个“ValueError”。 - Patrick Haugh
1
@PatrickHaugh 我会认为它是2.x版本。因为有print语句。 - MooingRawr
1
@MooingRawr的链接文档是针对3.1版本的。 - Patrick Haugh
哦,对不起,它在我这里首先链接到了2.7版本(可能看错标签了……) - MooingRawr
2个回答

11
你并没有真正创建一个bytearraybytes对象,你只是创建了一个包含'[511]'的字符串,因为在Python 2中,bytes只是str的同义词。在Python 3中,你会得到一个错误信息:would
ValueError: byte must be in range(0, 256)

以下代码可在Python 2或Python 3中运行;请注意我传递的是8位数字,因此它在范围内。

ba = bytearray([0b11111111])
print(repr(ba))

输出

bytearray(b'\xff')

2
如果您在Python 2中键入 help(bytes),它会显示 str 帮助页面。 - Adam Van Prooyen
根据错误信息 ValueError: byte must be in range(0, 256),256 这个值是被允许的,同时也包括了值为 0。这意味着一个字节有 257 种可能的取值。Python 总是让我印象深刻... - Rusty Gear
@RustyGear 不是的,range(0, 256) 会产生256个数字,从0到255。同样地,"abcdef"[0:3]是字符串"abc"。几乎所有Python中的元素都使用这种约定。 - PM 2Ring

1

代码:

a = 511
byte = a.to_bytes(byte length goes here, 'little')

解码:

a = int.from_bytes(byte, 'little')

谢谢,它能够工作。并且byte = (-511).to_bytes(2, 'little', signed=True)可以解决有符号类型的问题。 - thouger

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