获得负数的二进制补码的十六进制

问题描述:

我想将一个整数转换为一个字节串的数组。获得负数的二进制补码的十六进制

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.

+0

什么样的内部格式的 “字节” 应该对应 - 一些特定的一个或系统的原生?不是所有平台上的int都是32位和大端的。那些超出范围的数字呢? –

+0

该任务归结为将有符号整数转换为无符号整数。 –

如果确保转换的数字总是正数,然后屏蔽底部的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) 

我希望你觉得它有用!

+0

它也应该有'assert number >> bits == 0' - 对于大于预期位数的数字,算法会返回垃圾。 –

+0

严格地说,它应该返回范围为[0,len(h),2)]'的[['0x'+ h [i:i + 1]],其中'h =(“%% 0%d” (位// 4))%hex(...)'以符合问题陈述。但这是一个无关紧要的问题,所以我不介意这样。 –