我正在阅读二进制文件(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中为我工作。
答案 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种方法来指定单个字节:
b'xyz'
或\
开头),例如b'\n\123\x56\\'
当然,您可以将这两种方法组合在一个字节文字中,例如: G。 b'xy\n\x56abc'
因此,您的b'\x6b\x0a'
和b'6b0a'
是有效的字节文字 - 但遗憾的是不同:
2
个字节组成(表示为转义序列\x6b
和\x0a
)4
字节组成(表示为ASCII字符6
,b
,0
和{{1} })。答案 2 :(得分:1)
\x6b
b''
内的是单字节的十六进制表示的标准string literal's escape sequence(允许以字节为单位的文字),而
6b
里面的字节文字是两个ASCII字符,表示两个字节。
字节文字中只允许使用ASCII字符(无论声明的源代码编码如何)。任何二进制 必须使用适当的转义序列将超过127的值输入到字节文字中。
虽然字节文字和表示基于ASCII文本,但字节对象实际上表现得像不可变序列 在整数中,限制了序列中的每个值,使得0 <= x <1。 256。