一、负数向二进制和十六进制转换
负数neg=-45054,为int数据类型
方法一:
求负数十六进制的公式为:
负数十六进制 = hex ( 负数 & 0xFF....FF ) (注意:几个F取决于数据类型的范围,如int数据类型取0xFFFFFFFF)
neg十六进制 = hex(-45054 & 0xFFFFFFFF) = hex(4294922242) = 0xFFFF5002
neg二进制 = bin(neg十六进制)= bin(0xFFFF5002) = 11111111111111110101000000000010
方法二:
利用struct模块求负数的十六进制
import struct
s_hex_neg = pack('i', neg) = '\x02P\xff\xff' //这里是十六进制的可见字符ascii表示
利用binascii.hexlify将可见字符也进行十六进制表示
hex_neg = binascii.hexlify(s_hex_neg) = 0250ffff
将hex_neg进行逆置就是其十六进制
hex_neg[::-1] = ffff0520
二、十六进制还原成负数和二进制
neghex=0xFFFF0520,是int数据类型
1.十六进制转为二进制
negbin = bin(neghex)='0b11111111111111110000010100100000'
如果neghex_s='0xFFFF0520', 是字符串表示,那么negbin=bin(int(neghex_s, 16))='0b11111111111111110000010100100000'
2.十六进制还原为负数
先提取为十六进制的字符串,并逆置
neghex_s = hex(neghex)[2:-1] = 'ffff0520'
neghex_s=neghex_s[::-1] = '0250ffff'
使用binascii.unhexlify进行去十六进制化
neghex_pack=binascii.unhexlify(neghex_s)='\x02P\xff\xff'
再利用struct.unpack进行解析
neg=struct.unpack('i', neghex_pack)=(-45054,)
那么neg[0]就是neghex还原的负数
三、二进制向十六进制和负数转化
neg_bin_s='11111111111111110000010100100000',字符串类型
1.二进制向十六进制转化
首先将neg_bin_s按四个字符一组进行分割,然后求其十六进制表示,只要求出十六进制表示,就可以参考“二”进行处理了
neg_bin_list=[]
for i in range(0, len(neg_bin_s), 4):
neg_bin_list.append(neg_bin_s[i:i+4])
neg_bin_list=['1111', '1111', '1111', '1111', '0000', '0101', '0010', '0000']
求取0~15的二进制到十六进制字符的key-value映射
hex_map={}
for i in range(0,16):
hex_map[bin(i)[2:].zfill(4)]=hex(i)[2:]
以neg_bin_list元素为key,求取其表示的十六进制字符
neg_hex_s=''
for i in neg_bin_list:
neg_hex_s += hex_map[i]
求得:neg_hex_s = 'ffff0520'
从而,求得该二进制字符串对应的十六进制为0xFFFF0520
2.二进制还原成负数
在上面步骤1中求得二进制对应的十六进制为‘ffff0520',那么参考“十六进制还原成负数”的做法,可以求出负数
将十六进制"ffff0520"逆置
neghex_s=neg_hex_s[::-1] = '0250ffff'
使用binascii.unhexlify进行去十六进制化
neghex_pack=binascii.unhexlify(neghex_s)='\x02P\xff\xff'
再利用struct.unpack进行解析
neg=struct.unpack('i', neghex_pack)=(-45054,)
那么neg[0]就是二进制字符串neg_bin_s还原的负数