使用双斜杠从字符串到字节的编码问题

Enconding Problem from String to Bytes with double slash

不知道怎么解决。例如,如果我为我的代码提供参数 \xFF\xFF\xFF\x0E\xFF\xFF

当我 value.encode() 它 returns \xFF\xFF\xFF\x0E\xFF\xFFbytes 这与我想要的不同。

我的代码:

import crc8
import sys

value = sys.argv[1]
hash = crc8.crc8()

hash.update(value.encode())
print(hash.hexdigest())

我需要什么:

import crc8
import sys


hash = crc8.crc8()

hash.update(b'\xFF\xFF\xFF\x0E\xFF\xFF')
print(hash.hexdigest())

当您调用 value.encode() 时,它会将 str 编码为 bytes。该字符串字面上由 \xFF 等组成。您必须自己解析 str

如果您不关心验证输入(阅读:您正在编写一个只能由您执行的一次性脚本),这些 hack 中的任何一个都可以完成这项工作:

删除 \x 的所有实例,然后使用 binascii.unhexlify():

import crc8
import sys
import binascii

value = binascii.unhexlify(sys.argv[1].replace(r"\x", ""))
hash = crc8.crc8()

hash.update(value)
print(hash.hexdigest())

\x 的实例处拆分字符串,然后在每个 str 片段上将第二个参数 (base) 设置为 16 来调用 int,然后打包为 bytes:

import crc8
import sys

value = bytes(int(byte_str, 16) for byte_str in sys.argv[1].split(r"\x")[1:])
#value = bytes(map(lambda byte: int(byte, 16), sys.argv[1].split(r"\x")[1:]))
hash = crc8.crc8()

hash.update(value)
print(hash.hexdigest())

或者,如果您喜欢边缘生活,让 Python 为您解析:

import crc8
import sys

exec(f'value = b"{sys.argv[1]}"') # YOLO, FIDLAR!
hash = crc8.crc8()

hash.update(value)
print(hash.hexdigest())

如果您正在编写将在生产中使用的内容,您确实需要仔细验证和解析您的输入。