我不知道该如何解决。例如,如果我给代码\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())
当您调用value.encode()
时,它是将str
编码为bytes
。该字符串实际上是由\
,x
,F
,F
等组成。您必须自己解析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())
如果您正在编写将在生产中使用的东西,那么您确实确实需要仔细验证并解析您的输入。