获得负数的二进制补码的十六进制
我想将一个整数转换为一个字节串的数组。获得负数的二进制补码的十六进制
def int2Hex():
hex = '%08x' % 32
bytes = []
for i in range(0,4):
bytes.append('0x' + hex[i*2: i*2 + 2])
return bytes[::-1] #return in little endian
上面的代码适用于正数:['0x00', '0x00', '0x00', '0x20']
但是当我使用负数我会得到这样的事情:['0x-0', '0x00', '0x00', '0x20']
我想为负数为2的补字节。我使用python 2.
如果确保转换的数字总是正数,然后屏蔽底部的32位,则可以使用您的方法。
代码:
OFFSET = 1 << 32
MASK = OFFSET - 1
def int2Hex(num):
hex = '%08x' % (num + OFFSET & MASK)
bytes = []
for i in range(0, 4):
bytes.append('0x' + hex[i * 2: i * 2 + 2])
return bytes[::-1] # return in little endian
print(int2Hex(20))
print(int2Hex(-20))
结果:
['0x14', '0x00', '0x00', '0x00']
['0xec', '0xff', '0xff', '0xff']
您可以使用此:
def int2hex(number, bits):
""" Return the 2'complement hexadecimal representation of a number """
if number < 0:
return hex((1 << bits) + number)
else:
return hex(number)
我希望你觉得它有用!
它也应该有'assert number >> bits == 0' - 对于大于预期位数的数字,算法会返回垃圾。 –
严格地说,它应该返回范围为[0,len(h),2)]'的[['0x'+ h [i:i + 1]],其中'h =(“%% 0%d” (位// 4))%hex(...)'以符合问题陈述。但这是一个无关紧要的问题,所以我不介意这样。 –
什么样的内部格式的 “字节” 应该对应 - 一些特定的一个或系统的原生?不是所有平台上的int都是32位和大端的。那些超出范围的数字呢? –
该任务归结为将有符号整数转换为无符号整数。 –