老实说非常的气人,尤其是最近弄传感器,几乎每个传感器给python的十六进制或者我发的十进制都不对,经过测试,目前有这几种情况
其他python常用的十进制、16进制、字符串、字节串之间的转换
**1.python自带转换的十六进制.
2.int16转16进制 #无符号整形变的十六进制
3.int32转16进制 #有符号的整形变的十六进制
4.字符串转16进制 #字符串变来的十六进制**
1.的话非常神奇,也是我在某些传感器的返回值总结得到的如果你使用python的 hex() 方法直接对负数进行输出那么得到的就是,将你输入的数分割成符号和数值两部分,则你会得到一个带着符号的十六进制数(简直%%%@#$%&()&())),
import struct
a=struct.pack('i',-10014) # int32 为 4给十六进制的字节构成,int (有符号) 使用 i 输出:d8dcffff
print(a.hex())
print("\n")
c =b'\xff\xff\xd8\xe2'
c2 =b'\xe2\xd8\xff\xff'
c3 = c[::-1]
print(c3)
print(struct.unpack('i',c3)) # int
#D:\Anaconda\envs\3d\python.exe F:/open3d_cs/LMS141/多模型拼接/cs2.py
#e2d8ffff
#b'\xe2\xd8\xff\xff'
#(-10014,)
#进程已结束,退出代码 0
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