2012-12-22 154 views
7

输入= 'FFFF' #4 ASCII F公司我如何十六进制的ASCII字符串转换为有符号整数

期望的结果... -1为整数

代码尝试:

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

结果:65535

没有我试过似乎认识到'FFFF'是一个负数的表示。

+1

类似的东西(我不知道语法)'if(value> 0x7FFF)value - = 0x10000'? –

回答

10

的Python转换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 
+0

是的,'如果val> = 0x8000:val - = 0x10000'在输入已知为0 .. 0xFFFF(来自Jan Dvorak)的情况下也可以正常工作。 – greggo

2

在像C这样的语言中,'FFFF'可以解释为signed(-1)或unsigned(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('\xff\xff' == packed) 

# ..then UNpack it as a signed short integer 
signedVal = struct.unpack('h', packed)[0] 
assert(-1 == signedVal) 
+0

这里的字节顺序不是问题,因为h和H操作总是具有相同的字节顺序。 – greggo

+0

啊,真的。 +1给你的答案。 – bgporter

相关问题