在Python 3.2中使用signed string的十六进制字符串?

foo*_*ion 18 hex integer python-3.x

如何在Python 3.2中将十六进制字符串转换为signed int?

我能想到的最好的是

h = '9DA92DAB'
b = bytes(h, 'utf-8')
ba = binascii.a2b_hex(b)
print(int.from_bytes(ba, byteorder='big', signed=True))
Run Code Online (Sandbox Code Playgroud)

有更简单的方法吗?无符号是如此简单:int(h,16)

BTW,问题的起源是itunes持久性id - 音乐库xml版和iTunes hex版

Mar*_*nen 37

在n位二进制补码中,位具有值:

bit 0 = 2 0
bit 1 = 2 1
bit n-2 = 2 n-2
bit n-1 = -2 n-1

但是当无符号时,位n-1的值为2 n-1,因此该数字为2 n太高.如果设置了位n-1,则减去2 n:

>>> def twos_complement(hexstr,bits):
...     value = int(hexstr,16)
...     if value & (1 << (bits-1)):
...         value -= 1 << bits
...     return value
...
>>> twos_complement('FFFE',16)
-2
>>> twos_complement('7FFF',16)
32767
>>> twos_complement('7F',8)
127
>>> twos_complement('FF',8)
-1
Run Code Online (Sandbox Code Playgroud)


kic*_*hik 8

import struct
Run Code Online (Sandbox Code Playgroud)

对于Python 3(有评论帮助):

h = '9DA92DAB'
struct.unpack('>i', bytes.fromhex(h))
Run Code Online (Sandbox Code Playgroud)

对于Python 2:

h = '9DA92DAB'
struct.unpack('>i', h.decode('hex'))
Run Code Online (Sandbox Code Playgroud)

或者如果它是小端:

h = '9DA92DAB'
struct.unpack('<i', h.decode('hex'))
Run Code Online (Sandbox Code Playgroud)

  • 它没有.h.decode('hex')和bytes(h,'utf8')完全不同.你想要bytes.fromhex(h). (2认同)