Python 获取2'的十六进制;负数的s补码

Python 获取2'的十六进制;负数的s补码,python,twos-complement,Python,Twos Complement,我正在尝试将整数转换为字节字符串数组 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'] 但是当我使用负数时,我会得到如下

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

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。

您可以使用:

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)
def int2hex(数字,位):
“”“返回数字的2'补十六进制表示法”“”
如果数字<0:
返回十六进制((1您可以使用:

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)
def int2hex(数字,位):
“”“返回数字的2'补十六进制表示法”“”
如果数字<0:

返回十六进制((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']

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

“字节”应该对应什么内部格式?某个特定的字节或系统的本机字节?并非所有平台中的
int
s都是32位和大端字节。超出范围的数字如何?任务归结为将有符号整数转换为无符号整数。“字节”是什么内部格式应该对应于-某个特定的或系统的本机?并非所有平台中的
int
s都是32位和大端。超出范围的数字呢?任务归结为将有符号整数转换为无符号整数。对于大于预期位数的数字,它还应该具有
assert number>>位==0
s、 该算法将返回垃圾。严格来说,它应该为范围(0,len(h),2)内的i返回
['0x'+h[i:i+1]
,其中
h=(“%%0%d”%(位//4))%hex(…)
以符合问题陈述。但这是一个无关的问题,所以我不介意它。它还应该有
assert number>>位==0
-对于大于预期位数的数字,算法将返回垃圾。严格来说,对于范围(0,len(h),2)内的I,它应该返回
['0x'+h[I:I+1]
其中
h=(“%%0%d”%”(位//4))%hex(…)
以符合问题语句。但这是一个无关的问题,因此我不介意它是什么样子。