python中的强制类型转换,13003.数据类型转换问题(python)

 2023-09-25 阅读 16 评论 0

摘要:文章目录参考博客1 字符串与字节串转换2 对字节进行各种转换2.1 将字节转换为float类型2.2 字节串转换为整数(方法1)2.3 字节串转换为整数(方法2)3 struct 数据类型转换包4 字节数据转换为16进制数据 参考博客 python整数、字符串、字节串相互转换 1 字符串与字

文章目录

  • 参考博客
  • 1 字符串与字节串转换
  • 2 对字节进行各种转换
    • 2.1 将字节转换为float类型
    • 2.2 字节串转换为整数(方法1)
    • 2.3 字节串转换为整数(方法2)
  • 3 struct 数据类型转换包
  • 4 字节数据转换为16进制数据

参考博客

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

1 字符串与字节串转换

将字节串转换为字符串

b = b'Hello'
str(b, encoding = "utf-8")  
# 或者
bytes.decode(b)

python中的强制类型转换。将字符串转换为字节串

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]) # 1print("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语言的数据结构
在这里插入图片描述
在这里插入图片描述

  • python字符类型、转义为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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/94156.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息