python (正负)十六进制与十进制的互相转换

老实说非常的气人,尤其是最近弄传感器,几乎每个传感器给python的十六进制或者我发的十进制都不对,经过测试,目前有这几种情况

**1.python自带转换的十六进制.

2.int16转16进制 #无符号整形变的十六进制

3.int32转16进制 #有符号的整形变的十六进制

4.字符串转16进制 #字符串变来的十六进制**

1.的话非常神奇,也是我在某些传感器的返回值总结得到的如果你使用python的 hex() 方法直接对负数进行输出那么得到的就是,将你输入的数分割成符号和数值两部分,则你会得到一个带着符号的十六进制数(简直%%%@#$%&()&())),


b = -6231
print(hex(b))
#输出 -0x1857

而实际上,在使用的过程中,负数直接就是一个十六进制数,并没有带符号,则处理方式应该如下这样…

#正
a  = 6231
print("6231的正十六进制:" + str(hex(a)))

#负
b = -6231
b2 = -b
b = 0xffff - b2+ 0x0001
print("-6231的负十六进制:" + str(hex(b)))

#输出
#6231的正十六进制:0x1857
#-6231的负十六进制:0xe7a9

2-4的类型的十六进制与十进制互相转换就在下面的代码里,复制下来自己试吧…或者看开发文档里有写类型的话,直接找下面对应的,不用一个一个试

import struct
import binascii

a=struct.pack('h',-9000) # int16  为 short (有符号位) 使用 h 输出:d8dc
print(a.hex())
print("\n")

a=struct.pack('i',-9000) # int32  为 4给十六进制的字节构成,int (有符号) 使用 i 输出:d8dcffff
print(a.hex())
print("\n")

a='adcdadbc'
# a='00000000'
b=binascii.a2b_hex(a.encode())
print(b) #bytes类型,输出 b'\xad\xcd\xad\xbc'
print(b.hex()) #十六进制 输出:adcdadbc
print(struct.unpack('i',b)) # int
print(struct.unpack('f',b)) # float

c=struct.pack('h',0)
print(c.hex())



d8dc
d8dcffff
b'\xad\xcd\xad\xbc'
adcdadbc
(-1129460307,)
(-0.021216237917542458,)
0000

补:输入十进制输出 倒序的十六进制方法封装

import struct



def dec_to_hex(dec_num):
    """用于将输入的十进制数转换成十六进制,并按照关机电机的规则模式,两个字符一组倒序输出"""
    hex_bytes = struct.pack('i', dec_num) # int32  为 4给十六进制的字节构成,int (有符号) 使用 i 输出:d8dcffff
    print(type(hex_bytes))

    hex_string = hex_bytes.hex()

    print(hex_string)
    print(type(hex_string))
    new_string = hex_string[6:8] + " " + hex_string[4:6] + " " + hex_string[2:4] + " " + hex_string[0:2]
    print(new_string)





dec_to_hex(10000)

输出:

<class 'bytes'>
10270000
<class 'str'>
00 00 27 10

猜你喜欢

转载自blog.csdn.net/weixin_43134049/article/details/120833079