如何将十六进制ASCII字符串转换为有符号整数

8

输入 = 'FFFF' # 4个ASCII码为F的字符

期望结果 ... 以整数形式返回-1

尝试的代码:

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

结果:65535

我尝试的所有方法都似乎没有将“FFFF”识别为负数的表示形式。


1
类似这样的编程代码:if(value > 0x7FFF) value -= 0x10000 - John Dvorak
2个回答

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

是的,“if val >= 0x8000: val -= 0x10000” 在输入为 0 .. 0xFFFF(来自 Jan Dvorak)时也能正常工作。 - greggo

2
在像 C 这样的编程语言中,'FFFF' 可以被解释为带符号(-1)或无符号(65535)的值。您可以使用 Python 的 struct 模块来强制执行所需的解释。请注意,下面的代码可能存在字节序问题,并且它不能处理超过 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)

字节序在这里不是问题,因为 h 和 H 操作始终具有相同的字节序。 - greggo
啊,没错。你的回答加一分。 - bgporter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接