1  十六进制转十进制

1)str(a)

若a本身是以十六进制表示的,那么直接打印出来的是十进制的数值。str()可以将十六进制的数强制转换成十进制的字符串:

num = 0xFFFF
print('num的值为', num)
print('num的类型为', type(num))
print('str(0xFFFF)的值为', str(num))
print('str(0xFFFF)的类型为', type(str(num)))

运行结果: 

python 16进制高低位合并 python 16进制转换为10进制_python3 16进制运算

2)int(a, 16)

 其中,a必须是字符串格式。这种方式适用于数值本身是以字符串形式存储的情况。例如以下两段代码,只有第二段的结果是正确的。

num = 0xFFFF
print(int(str(num)), 16)


num = '0xFFFF'
print(int(num), 16)

运行结果: 

 

python 16进制高低位合并 python 16进制转换为10进制_字符串_02

2  十进制转十六进制

hex(a)

其中a为int整型,而转换结果为字符串类型:

print(hex(65535))
print(type(hex(65535)))

 运行结果:

 

python 16进制高低位合并 python 16进制转换为10进制_十六进制_03

3  由补码求原码

当得到的4位16进制数以补码形式呈现时,需要我们对其再作处理,才能得到含符号的十进制数据:

data = []
msg = ['0x0124', '0xFFB3', '0xB75E', '0x005D']
for i in range(len(msg)):
    data.append(msg[i])
    data[i] = int(data[i], 16)
    if (data[i] & 0x8000 == 0x8000):
        data[i] = -((data[i] - 1) ^ 0xFFFF)     
        # 由补码求得原码,一定记得取反得是'^ 0xFFFF',不能是'^ 0x7FFF'

运行结果: 

python 16进制高低位合并 python 16进制转换为10进制_python_04

而通过在线原码补码转换器可以验证,0xFFB3和0xB75E的原码分别位-77和-18594,正数的补码即原码,0x0124和0x005D的原码分别为292和93。结果正确。