将问题从字符串转换为带双斜杠的字节

问题描述 投票:0回答:1

我不知道该如何解决。例如,如果我给代码\xFF\xFF\xFF\x0E\xFF\xFF

设置参数

当我执行value.encode()时,它在\\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())
python byte crc
1个回答
0
投票

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

[如果您不关心验证输入(阅读:您正在编写仅由您执行的一次性脚本),那么这些技巧中的任何一种都可以完成此工作:

删除\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的实例处分割字符串,然后在每个int片段的第二个参数(base)设置为16的情况下调用str,然后打包为bytes

import crc8
import sys

value = bytes(int(byte_str, 16) for byte_str in value.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())

如果您正在编写将在生产中使用的东西,那么您确实确实需要仔细验证并解析您的输入。

© www.soinside.com 2019 - 2024. All rights reserved.