文章目录
参考博客
1 字符串与字节串转换
将字节串转换为字符串
b = b'Hello'
str(b, encoding = "utf-8")
# 或者
bytes.decode(b)
将字符串转换为字节串
s = 'Hello'
bytes(s, encoding = "utf8")
# 或者
str.encode(s)
2 对字节进行各种转换
场景: 一般通过网络TCP/UDP接收到数据为字节串,那么收到这些字节串之后,需要进行各种数据提取
2.1 将字节转换为float类型
# !表示网络字节序 大端,f 表示转换为float类型
def bytes2float(byte_data):
return struct.unpack("!f",byte_data)[0]
2.2 字节串转换为整数(方法1)
先将字节串转换为16进制字符串,在将16进制字符串转换为整形数据
byte_str = b'\x00\x00\x02\xf7'
data_hex = bytes.hex(byte_str)
data_int = int(data_hex, 16)
print("data_int:", data_int)
# 封装成函数:功能将字节串转换为整数,支持字节串切片的形式传递参数.
# bytes2int(b'\x11') -> 0x11
# bytes2int(data[0:4]) 前合后开形式,取值范围0到3.
def bytes2int(data):
data_hex = bytes.hex(data)
data_int = int(data_hex,16)
return data_int
#函数调用如下,需要注意的是步骤不能省略,不能去掉赋值的中间步骤.
data_int2 = bytes2int(response[7:9])
print("data_int2:", data_int2)
data_int 打印结果为759
data_int2 = int('000012d5',16) # 16进制字符串
print("data_int2:", data_int2) # 结果为4821
2.3 字节串转换为整数(方法2)
bytes_str=b'\x00\x00\x00\x01'
temp = struct.unpack('!i',bytes_str) # !表示要转换的数据,为网络字节序, struct 返回值为元组
print("temp:", temp[0]) # 1
print("temp:", temp) # 打印(1,)
temp = struct.unpack('!h',response[7:9]) # !表示要转换的数据,为网络字节序; h 表示无符合短整型,传递切片只能是2个字节的整数倍
print("temp:", temp[0])
temp = struct.unpack('!i',response[5:9]) # !表示要转换的数据,为网络字节序; i 表示整型,传递切片只能是4个字节整数倍,如果切片传递2个字节则报错.
print("temp:", temp[0])
3 struct 数据类型转换包
使用网络数据包常用的struct,兼容c语言的数据结构
-
转义为short型整数:
struct.unpack('<hh', bytes(b'\x01\x00\x00\x00')) #打印结果(1, 0) ,< 表示要转换的数据为小端字节序,低字节在前。
-
转义为long型整数:
struct.unpack('<L', bytes(b'\x01\x00\x00\x00')) # (1,) ,L代表无符号长整型.
-
整数to字节串
# 转为两个字节: struct.pack('<HH', 1,2) ==> b'\x01\x00\x02\x00'
#转为四个字节: struct.pack('<LL', 1,2) ==> b'\x01\x00\x00\x00\x02\x00\x00\x00'
-
将float类型数据转换字节串,网络字节序
struct.pack('>f', 1.0) ==> b'\x3f\x80\x00\x00'
- c语言端将大端字节序转换为小端字节序的float数据.
# 可以与上一条python代码进行互转.
float bigorder_combine_float(uint8_t *buffer)
{
float temp;
for(int i=0; i<4; i++)
{
((uint8_t *)(&temp))[i] = buffer[3-i];
}
if(isnan(temp) == 1)
{
return 0x7fffffff;
}
return tmep;
}
4 字节数据转换为16进制数据
#change the bytes data to hex
#like: b'\x12' -> "12"
def bytes2hex(data):
data_hex = bytes.hex(data)
return data_hex
hex函数:将bytes(b'\x00\x01\x02\x03\x04\x05')的值转换成hexstr('000102030405')
fromhex函数:将hexstr转为:bytes
5 将整数转换为字节数组
sys_data_len = len(senddata1) # 获取一个字符串长度,为整数类型
# 字节数,大小端,符合类型
sys_data_len_bytes=sys_data_len.to_bytes(4, byteorder='big', signed=False) # python3.10 后支持的.
print("nbytes:", sys_data_len_bytes)
6 字节数组和字串之间的转换
data=b'"production_info"'
data.decode()
str_data="production_info"
str_data.encode()