对Python字节类型感到困惑

对Python字节类型感到困惑,python,struct,Python,Struct,我正在阅读一个二进制文件(Python3),并试图在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'> <clas

我正在阅读一个二进制文件(Python3),并试图在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'>


我搞混了什么?我想这在Python2.x中曾经适用。

b'\x6b\x0a'
是两个字节:0x6b 0x0a<代码>b'6b0a'是四个字节:0x36 0x62 0x30 0x61

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

b'\x6b\x0a'
是两个字节:0x6b 0x0a<代码>b'6b0a'是四个字节:0x36 0x62 0x30 0x61

>>> binascii.unhexlify(b'6b0a')
b'k\n'
在a
b''
中是单个字节的十六进制表示的标准(也允许以字节文字表示),而

在该字节文本中有两个ASCII字符,表示两个字节

发件人:

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

虽然字节文字和表示基于ASCII文本,但字节对象的行为实际上类似于不可变序列 整数,序列中的每个值都受到限制,因此0 在a
b''
中是单个字节的十六进制表示的标准(也允许以字节文字表示),而

在该字节文本中有两个ASCII字符,表示两个字节

发件人:

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

虽然字节文字和表示基于ASCII文本,但字节对象的行为实际上类似于不可变序列 整数,序列中的每个值都受到限制,因此0内部可以使用两种方法指定单个字节:

  • 一种直接的ASCII字符,例如。g<代码>b'xyz',或
  • an(以
    \
    开头),例如
    b'\n\123\x56\\\'
  • 当然,您可以在一个字节文本中组合这两种方法,例如。g<代码>b'xy\n\x56abc'

    因此,您的
    b'\x6b\x0a'
    b'6b0a'
    a都是有效的字节文本-但不幸的是不同:

    • 第一个由
      2
      字节组成(表示为转义序列
      \x6b
      \x0a
    • 第二个由
      4
      字节组成(表示为ASCII字符
      6
      b
      0
      a
    在内部,您可以使用两种方法指定单个字节:

  • 一种直接的ASCII字符,例如。g<代码>b'xyz',或
  • an(以
    \
    开头),例如
    b'\n\123\x56\\\'
  • 当然,您可以在一个字节文本中组合这两种方法,例如。g<代码>b'xy\n\x56abc'

    因此,您的
    b'\x6b\x0a'
    b'6b0a'
    a都是有效的字节文本-但不幸的是不同:

    • 第一个由
      2
      字节组成(表示为转义序列
      \x6b
      \x0a
    • 第二个由
      4
      字节组成(表示为ASCII字符
      6
      b
      0
      a

    Ty。如何将b'6b0a'转换为b'\x6b\x0a?Ty。我没有看到这一点,因为表示为ascii,这是我的问题开始。所以导入binascii print(解包(“h”,binascii.unexlify(b'6b0a'))-->((2667,)works.Ty。我如何将b'6b0a'转换为b'\x6b\x0a?Ty。由于表示为ascii,这是我的问题。所以导入binascii print(解包(“h”,binascii.unexlify(b'6b0a'))-->((2667,)起作用。
    6b