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(…)
以符合问题语句。但这是一个无关的问题,因此我不介意它是什么样子。