我有一个负整数(4个字节),我想要得到它的二进制补码形式的十六进制表示。
>>> i = int("-312367")
>>> "{0}".format(i)
'-312367'
>>> "{0:x}".format(i)
'-4c42f'
但是我想看到 "FF..."
我有一个负整数(4个字节),我想要得到它的二进制补码形式的十六进制表示。
>>> i = int("-312367")
>>> "{0}".format(i)
'-312367'
>>> "{0:x}".format(i)
'-4c42f'
但是我想看到 "FF..."
>>> x=-123
>>> hex(((abs(x) ^ 0xffff) + 1) & 0xffff)
'0xff85'
(虽然可能不是最优雅的方式)
0xffff
(16位二进制补码中的-1),而不是0x0001
。 - dcoles>>> x = -123
>>> bits = 16
>>> hex((1 << bits) + x)
'0xff85'
>>> bits = 32
>>> hex((1 << bits) + x)
'0xffffff85'
0xff85
视为有符号还是无符号都没有关系。 - John La Rooyx=-123
写出来可能会更清晰。 - John La Rooy>>> hex((-4) & 0xFF)
'0xfc'
要将整数视为二进制值,您需要使用所需位长的掩码进行按位与操作。
例如,对于4字节值(32位),我们使用掩码0xffffffff
:
>>> format(-1 & 0xffffffff, "08X")
'FFFFFFFF'
>>> format(1 & 0xffffffff, "08X")
'00000001'
>>> format(123 & 0xffffffff, "08X")
'0000007B'
>>> format(-312367 & 0xffffffff, "08X")
'FFFB3BD1'
struct
模块执行 Python 值和表示为 Python 字节对象的 C 结构之间的转换。打包的字节对象提供对单个字节值的访问。
这可用于显示底层 (C) 整数表示。
>>> packed = struct.pack('>i',i) # big-endian integer
>>> type(packed)
<class 'bytes'>
>>> packed
b'\xff\xfb;\xd1'
>>> "%X%X%X%X" % tuple(packed)
'FFFB3BD1'
>>>