【发布时间】:2017-01-12 13:17:39
【问题描述】:
我想在处理字节时使用十六进制值。但是我不太确定这是如何完成的。例如:
>>> bytearray([0x10,0x20,0x30])
bytearray(b'\x10 0')
为什么 0x20 和 0x30 会被忽略?
【问题讨论】:
我想在处理字节时使用十六进制值。但是我不太确定这是如何完成的。例如:
>>> bytearray([0x10,0x20,0x30])
bytearray(b'\x10 0')
为什么 0x20 和 0x30 会被忽略?
【问题讨论】:
0x20 和 0x30 不会被忽略:bytearray 的格式类似于 ASCII 字符,0x20 恰好是空格 () 的 ASCII 码,0x30 也是如此映射到零 (0)。
这只是表示二进制数组的一种简洁方式。您可以在此Wikipedia article 中读取所有值及其对应的字符。
如果字符不可打印,则将其格式化为\x??,?? 为十六进制代码。
【讨论】:
它们不会被忽略。 0x20 是空格的 ASCII 码点,0x30 是数字 0。两者都在输出中,跟在\x10 字节之后。
您看到的是字节值的表示,它试图尽可能地可读。它通过将可打印 ASCII 范围内的任何字节显示为该 ASCII 字符来实现。任何无法表示的内容都显示为\xhh 转义序列或较短的两个字符\? 转义(例如\n 用于换行符或\t 用于制表符)。
请注意,Python 会为每个 0xhh 十六进制表示法生成一个整数值;它只不过是产生相同整数值的替代语法。您也可以使用十进制表示法或八进制表示法,结果是一样的;您将 整数值 放入 list 对象中,然后从中创建 bytearray 对象。在这个过程中,原始的十六进制表示法不保留:
>>> [0x10, 0x20, 0x30]
[16, 32, 48]
>>> bytearray([16, 32, 48])
bytearray(b'\x10 0')
>>> [0o20, 0o40, 0o60]
[16, 32, 48]
>>> bytearray([0o20, 0o40, 0o60])
bytearray(b'\x10 0')
bytearray 中的实际值仍然是整数;如果您索引到对象,您将获得单个字节值:
>>> ba = bytearray([0x10, 0x20, 0x30])
>>> ba
bytearray(b'\x10 0')
>>> ba[1] # 0x20, the space
32
>>> ba[2] # 0x30, the 0 digit
48
【讨论】:
io.BytesIO()。
x = io.BytesIO(bytes([0x10, 0x20, 0x30])),然后是x.read(1),等等
b = x.read(1),然后再做print b,我就空白了。如何让它存储数值而不是 ascii 表示?