提问人:Hypherix 提问时间:10/4/2023 最后编辑:Hypherix 更新时间:10/5/2023 访问量:76
将 bytes 对象中的双反斜杠替换为单反斜杠
Replace double backslashes with single backslashes in a bytes object
问:
我正在编写一个程序,其中我处理bytes对象。程序生成一个 bytes 对象(来自字符串),其中的一部分是随机生成的(如果我运行程序两次,bytes 对象的一部分看起来会不同,另一部分总是相同的)。bytes 对象始终包含多个双反斜杠,在程序的某一部分,我想用单反斜杠替换它们。
我遇到的问题是,有时我成功地替换了双反斜杠,有时字节对象中的字符会完全错误。
我用单反斜杠替换双反斜杠的方法本质上是使用解码和编码,正如有类似问题的帖子中的建议一样。以下示例显示了何时按预期工作:
string1 = '\\xeb\\x97\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00'
bytes_double_back = string1.encode(encoding='ascii') # b'\\xeb\\x97\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00'
bytes_single_back = bytes_double_back.decode('unicode_escape').encode('raw_unicode_escape') # b'\xeb\x97\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00'
但是,当再次运行程序时,这次的字符串看起来略有不同,但会出现问题:
string1 = '\\x3d\\x5b\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00'
bytes_double_back = string1.encode(encoding='ascii') # b'\\x3d\\x5b\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00'
bytes_single_back = bytes_double_back.decode('unicode_escape').encode('raw_unicode_escape') # b'=[\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00'
在这里,bytes_single_back确实摆脱了双反斜杠,但它的开头没有正确转换。
我做错了什么?提前致谢!
答:
开头似乎正确地转换到我身上。请注意,字节字符串不只包含转义的十六进制代码。有时十六进制码可以在 ASCII 中打印。 被打印出来。这与 See 相同"hello".encode()
b'hello'
b'\x68\x65\x6c\x6c\x6f'
b'hello'==b'\x68\x65\x6c\x6c\x6f'
因此,在您的情况下,恰好与 .为什么python会打印长版本,而短版本可以?b'\x3d\x5b'
b'=[
然后,当然,其余的,没有同义词(没有表示 ascii charb'\x01\x00\x00\x01...
b'\x01'
)
再次检查.相同的 4 个字节长字节串中的相同 4 个字节。只有两种方法可以编写相同的字节字符串。b'\x3d\x5b\x01\x00'==b'=[\x01\x00'
所以,简而言之,这就是字节串在屏幕上打印的方式。with for 字节,没有 ascii 表示形式。当该字符明确时,对某些字符的 ascii 代码或直接作为单个字符的字节进行转义。
例如,默认情况下打印为 因为 0x27 是 的 ascii 代码。同样是打印的,因为0x22是 的 ascii 代码。但打印为 .它用于将字节字符串括起来,然后需要转义字符。\x01
b'\x27'
b"'"
'
b'\x22'
b'""
"
b'\x27\x22'
b'"\''
'
'
评论
b'\x3d\x5b'
b\=['
b'\x3d\x5b'
b'=['
b'\x3d\x5d'
b'=['
b'\x3d\x5b'
b'=['
\x3d\x5b
hex
bytes_single_back.hex()
\x
评论