Python:int(hexstr)vs.bytes.fromhex()

Python:int(hexstr)vs.bytes.fromhex(),python,data-conversion,language-design,Python,Data Conversion,Language Design,考虑从十六进制字符串构造int,而不是构造bytes对象: hexstr = "FFF" # note there is an odd number of characters int(hexstr, base=16) Out[110]: 4095 bytes.fromhex(hexstr) Traceback (most recent call last): File "C:\Miniconda3\lib\site-packages\IPython\core\interactives

考虑从十六进制字符串构造int,而不是构造bytes对象:

hexstr = "FFF" # note there is an odd number of characters

int(hexstr, base=16)
Out[110]: 4095


bytes.fromhex(hexstr)
Traceback (most recent call last):
  File "C:\Miniconda3\lib\site-packages\IPython\core\interactiveshell.py", line 3319, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-107-0e5b955c6858>", line 1, in <module>
    bytes.fromhex(hexstr)
ValueError: non-hexadecimal number found in fromhex() arg at position 3
因此int()可以处理奇数个十六进制字符,但bytes.fromhex()不能。 实际上,of bytes.fromhex()明确表示每个字节需要2个字符

这些都是事实,我没有反驳

相反,我的问题是一个语言设计问题:这种不一致的原因是什么? 为什么在转换为整数时可以假定前导零,但在转换为字节时不可以?

int(hexstr,16)
获取整个十六进制数并将其转换为整数

bytes.fromhex(hexstr)
另一方面,将输入拆分为成对的十六进制数字,将每对数字转换为一个字节(一对十六进制数字可以包含与单个字节完全相同的值范围,这就是为什么十六进制通常用于表示二进制数据)并用所有这些字节创建一个bytestring

这些是不同的操作,因此它们对输入有不同的约束是正常的。

int(hexstr,16)
获取整个十六进制数并将其转换为int

bytes.fromhex(hexstr)
另一方面,将输入拆分为成对的十六进制数字,将每对数字转换为一个字节(一对十六进制数字可以包含与单个字节完全相同的值范围,这就是为什么十六进制通常用于表示二进制数据)并用所有这些字节创建一个bytestring

这些是不同的操作,所以它们对输入有不同的约束是正常的

hexstr = "0FFF"  # now we have an even number of hex characters
bytes.fromhex(hexstr)
Out[109]: b'\x0f\xff'