仅'x'编写十六进制指示,同时避免"值错误:无效的 \x 转义"


有很多

关于错误消息ValueError: invalid x escape的帖子,但是,尽管这是一个简单的问题,但我仍然卡住了。我正在尝试用不同的构建块构建一条字节串。最后,它必须看起来像:

b'Khx10x10x10'

所以开头有两个 ASCII 符号和三个十六进制值。我已经有K(来自dict_birdnumbers[int(birdname)](和'10'(finangle(作为变量。我尝试使用原始文本字符串

hex = r'x'
line3 =  dict_birdnumbers[int(birdname)] + 'h' + hex + finangle + hex + finangle + hex + finangle
print(line3.encode()) 

我使用.encode()来确保它是一个字节串。但是,我得到的结果是

b'Kh\x10\x10\x10'

所以一个反斜杠太多了。如果我删除hex中的反斜杠,我只会得到b'Khx10x10x10'.如果我使用像hex = 'x'这样的普通字符串,我会收到错误消息ValueError: invalid x escape.我能做什么?

xhh是一个符号;每个xhh序列创建一个字符。您不能连接x和两个十六进制数字以获得相同的效果。

相反,只需将整数序列传递给bytes()

finagle = int(finangle, 16)  # assuming finagle is a hex notation string
line3 =  b'%sh%s' % (
    dict_birdnumbers[int(birdname)].encode('ascii'),
    bytes([finangle, finangle, finangle])
)

这将创建一个具有 3 个字节的 bytes 对象,每个字节的整数值为 16,十六进制值为 10。bytesrepr()输出恰好使用 xhh 来显示此类字节,因为替代方案并非真正可打印(这是针对所有不可打印的字节值,即可打印 ASCII 范围之外的值(:

>>> bytes([0x10, 0x10, 0x10])  # 3 integers using hex syntax
b'x10x10x10'

最新更新