【问题标题】:Get the hex of 2's complement for negative numbers [duplicate]获取负数的 2 补码的十六进制 [重复]
【发布时间】:2017-04-12 01:13:53
【问题描述】:

我正在尝试将整数转换为字节字符串数组。

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。

【问题讨论】:

  • “字节”应该对应的内部格式是什么——某个特定的格式还是系统的本机格式?并非在所有平台中ints 都是 32 位和大端。超出范围的数字怎么办?
  • 任务归结为将有符号整数转换为无符号整数。

标签: python twos-complement


【解决方案1】:

如果您确保转换的数字始终为正数,然后屏蔽底部 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']

【讨论】:

    【解决方案2】:

    你可以用这个:

    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&gt;&gt;bits==0 - 对于大于预期位数的数字,算法将返回垃圾。
    • 严格来说应该返回['0x'+h[i:i+1] for i in range(0,len(h),2)] where h=("%%0%d"%(bits//4))%hex(...) 符合问题陈述。但这是一个无关紧要的问题,所以我不介意。
    猜你喜欢
    • 1970-01-01
    • 2014-11-03
    • 2011-10-05
    • 2013-02-02
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多