使用双斜杠从字符串到字节的编码问题
Enconding Problem from String to Bytes with double slash
不知道怎么解决。例如,如果我为我的代码提供参数 \xFF\xFF\xFF\x0E\xFF\xFF
当我 value.encode()
它 returns \xFF\xFF\xFF\x0E\xFF\xFF
在 bytes
这与我想要的不同。
我的代码:
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
。该字符串字面上由 \
、x
、F
、F
等组成。您必须自己解析 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())
如果您正在编写将在生产中使用的内容,您确实需要仔细验证和解析您的输入。
不知道怎么解决。例如,如果我为我的代码提供参数 \xFF\xFF\xFF\x0E\xFF\xFF
当我 value.encode()
它 returns \xFF\xFF\xFF\x0E\xFF\xFF
在 bytes
这与我想要的不同。
我的代码:
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
。该字符串字面上由 \
、x
、F
、F
等组成。您必须自己解析 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())
如果您正在编写将在生产中使用的内容,您确实需要仔细验证和解析您的输入。