对Python字节类型感到困惑

时间:2017-11-10 02:21:57

标签: python struct

我正在阅读二进制文件(Python 3),并尝试在 struct 模块的帮助下转换块。

f = open(fn, "rb")
try:
    a=f.read(2)
...

当我使用时:

unpack("h",b'\x6b\x0a')

它给了我预期的

(2667,)

但我无法在

上使用该语法
b'6b0a' 

即使:

print(type(b'6b0a'))
print(type(b'\x6b\x0a'))

给出相同的类型:

<class 'bytes'>
<class 'bytes'>

我在混什么?我认为这曾经在Python 2.x中为我工作。

3 个答案:

答案 0 :(得分:2)

b'\x6b\x0a'是两个字节:0x6b 0x0a。 b'6b0a'是四个字节:0x36 0x62 0x30 0x61。

>>> binascii.unhexlify(b'6b0a')
b'k\n'

答案 1 :(得分:2)

bytes literals内,您可以使用 2种方法来指定单个字节:

  1. 直接ASCII字符,例如G。 b'xyz'
  2. escape sequence(以\开头),例如b'\n\123\x56\\'
  3. 当然,您可以将这两种方法组合在一个字节文字中,例如: G。 b'xy\n\x56abc'

    因此,您的b'\x6b\x0a'b'6b0a'有效的字节文字 - 但遗憾的是不同:

    • 1 st 一个由2个字节组成(表示为转义序列\x6b\x0a
    • 2 nd 一个由4字节组成(表示为ASCII字符6b0和{{1} })。

答案 2 :(得分:1)

\x6b
b''内的

单字节的十六进制表示的标准string literal's escape sequence(允许以字节为单位的文字),而

6b

里面的字节文字是两个ASCII字符,表示两个字节

来自Python documentation

  

字节文字中只允许使用ASCII字符(无论声明的源代码编码如何)。任何二进制   必须使用适当的转义序列将超过127的值输入到字节文字中。

     

虽然字节文字和表示基于ASCII文本,但字节对象实际上表现得像不可变序列   在整数中,限制了序列中的每个值,使得0 <= x <1。 256。