13003.数据类型转换问题(python)

参考博客

python整数、字符串、字节串相互转换

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()
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guangshui516

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值