首先是一个nitpick:不是字符,它是字符串。主要问题是
int()
不同,没有定义的数字大小。
对于int()
,输入
000000bd
和
bd
因此是相同的;符号取决于存在或不存在-
前缀。对于您的输入号码的任意位计数(不仅是标准的8、16、32,...),您将需要手动执行两组转换步骤,并告诉其所谓的输入大小。 (在C中,您可以通过将转换结果分配给目标位大小的整数变量来隐含地做到这一点)。
def hex_to_signed_number(s, width_in_bits):
n = int(s, 16) & (pow(2, width_in_bits) - 1)
if( n >= pow(2, width_in_bits-1) ):
n -= pow(2, width_in_bits)
return n
该功能的某些测试容器:
In [6]: hex_to_signed_number("bd", 8)
Out[6]: -67
In [7]: hex_to_signed_number("bd", 16)
Out[7]: 189
In [8]: hex_to_signed_number("80bd", 16)
Out[8]: -32579
In [9]: hex_to_signed_number("7fff", 16)
Out[9]: 32767
In [10]: hex_to_signed_number("8000", 16)
Out[10]: -32768
print(int.from_bytes(bytes.fromhex("bd"), byteorder="big", signed=True))
您可以将字符串转换为字节,然后通过将签名添加到true来将字节转换为int,这将为您带来负整数值。