如何将十六进制ASCII字符串转换为签名的整数



input ='ffff'#4 ascii f's

所需的结果... -1作为整数

试用了代码:

hexstring = 'FFFF'
result = (int(hexstring,16))
print result #65535

结果:65535

我尝试过的任何事情似乎都认识到" ffff"是负数的表示。

python在'face value'中将ffff转换为十进制65535

input = 'FFFF'
val = int(input,16) # is 65535

您希望它将其解释为16位签名的号码。下面的代码将采用任何数字的较低16位,并且"签名扩展",即解释作为16位签名的值并交付相应的整数

val16 = ((val+0x8000)&0xFFFF) - 0x8000

这很容易概括

def sxtn( x, bits ):
     h= 1<<(bits-1)
     m = (1<<bits)-1
     return ((x+h) & m)-h

在诸如C之类的语言中,'ffff'可以解释为签名(-1)或无符号(65535)值。您可以使用Python的结构模块来迫使您想要的解释。

请注意,下面的代码可能没有试图处理的终点问题,并且它不会处理长度超过16位的数据,因此,如果其中任何一种情况都在对你的效果。

import struct
input = 'FFFF'
# first, convert to an integer. Python's going to treat it as an unsigned value.
unsignedVal = int(input, 16)
assert(65535 == unsignedVal)
# pack that value into a format that the struct module can work with, as an 
# unsigned short integer
packed = struct.pack('H', unsignedVal)
assert('xffxff' == packed)
# ..then UNpack it as a signed short integer
signedVal = struct.unpack('h', packed)[0]
assert(-1 == signedVal)

最新更新