Python使用struct模块转换C语言结构体,打包、解包二进制数据

更新时间:2023-07-19 05:57:07 阅读: 评论:0

孕妇能吃香菜吗Python使⽤struct模块转换C语⾔结构体,打包、解包⼆进制数据
本⽂是我使⽤socket测试⽹络接⼝写的消息头,其中包含以下内容:
(1)通过Python的struct模块将C的结构体转换成Python语⾔(struct.Struct)
(2)打包和解包(pack_into和unpack_from)
(3)序列化和反序列化(SerializeToString和ParFromString)
C语⾔的消息头如下,是个C的结构体:
#pragma pack(1)
struct PduHead{
unsigned int  flag;
unsigned short packet_len;
unsigned int  cmd;
unsigned char  version;
高中生物实验会考
unsigned char  rerve[1];
unsigned char  body[0];
};
#pragma pack()
将C语⾔的消息头转换为Python类,其中rerve[1]是保留字,不⽤管,body[0]是个长度为0的数组,保存body的⾸地址,也不⽤管。转换后如下
import ctypes
class PduHead(object):
def __init__(lf, cmdtype=0):
暴雨山洪lf.flag = GLOBAL_SIGNAL_FLAG
lf.packet_len = 0
lf.version = VERSION
# struct.Struct返回⼀个新的Struct对象,根据传⼊的字节顺序字符串写⼊和读取⼆进制数据
# “!IHIcc”表⽰⼆进制数据的字节顺序
# “!”表⽰字节顺序为network
# “IHIcc”分别是根据以上⼏个参数的类型得到的格式字符
# ⼆进制流会根据这个字节顺序去解析
lf.struct = struct.Struct('!IHIcc')
# 序列化函数
def SerializeToStringWithMsg(lf, req_msg):
if not req_msg:
<('No request message t!')
return ''
body_str = req_msg.SerializeToString()  # 序列化,将对象转化为可传输的⼆进制流
values = (lf.flag, len(body_str) + lf.struct.size, lf.cmd, lf.version, '\0')
buffer = ate_string_buffer(lf.struct.size) # 创建⼀个buffer
0x0000004e人我不分lf.struct.pack_into(buffer, 0, *values)  # 根据字节序打包,将打包的字节写⼊到buffer中,values元组表⽰要写⼊的值
菠萝蜜盆栽# buffer对象提供了raw属性访问当前buffer内容
# 该⽅法返回⼀个要传输的消息头和消息体的⼆进制流
74ls85return buffer.raw + body_str
# 反序列化函数
def ParFromStringWithMsg(lf, data):
# 根据字节序解析⼆进制流,返回⼀个元素,形似SerializeToStringWithMsg⽅法中的value,所以lf.cmd是元组的第三个元素        lf.cmd = lf.struct.unpack_from(data[:lf.struct.size])[2]
resp_msg = (lf.cmd)  # 根据lf.cmd得到响应数据的⼆进制流(这是个不⽤关⼼,跟业务有关)
if not resp_msg:
<('Message [%d] Not Found!' % lf.cmd)
return None
resp_msg = resp_msg()
if resp_msg:
关于七的成语
resp_msg.ParFromString(data[lf.struct.size:])  # 反序列化,将⼆进制流转化为实际的对象
return [lf.cmd, resp_msg]
字节顺序:
1、字节顺序的第⼀个字符可⽤于指⽰打包数据的字节顺序、⼤⼩和对其⽅式
C和Python之间的类型转换,组合的字符串表⽰⼆进制数据的字节顺序,如上⾯程序中的“!IHIcc”

本文发布于:2023-07-19 05:57:07,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1087379.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:进制   字节   顺序   数据   打包   对象   消息   序列化
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图