如何使用Python优雅地发送/接收大型C结构?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使用Python优雅地发送/接收大型C结构?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1644字,纯文字阅读大概需要3分钟。
内容图文
![如何使用Python优雅地发送/接收大型C结构?](/upload/InfoBanner/zyjiaocheng/653/0d65adf2fa4f4bdfbe594e87ec71a017.jpg)
我已经开始编写Python 3.x客户端应用程序.服务器应用程序已经存在并且用C编写.服务器提供了一个C头文件,其中定义了两个用于通过UDP发送和接收数据的结构(我正在使用Python的套接字模块).
问题在于C结构非常大(每个大约200个元素).如果我使用Python的struct模块打包/拆包数据,那么不太好的解决方案是手动打包/拆包200个元素,例如:
struct.pack('H...I', data1, ..., data200)
此外,我希望能够使用类似C的语法访问Python中的已接收/已发送元素.例如,如果我在C服务器端
send.data.pos = pos;
如果我可以像这样在Python客户端中访问pos变量,那将是很好(最自然):
pos = recv.data.pos
请注意,问题不在于如何像this线程那样从头文件中自动从Python文件中写入结构(我在用Python逐个写入每个结构字段时没有问题),而是什么是最好的组织方式Python中的数据(例如,在类中,使用字典等),这将使我能够利用Python的功能并简化代码并使数据易于访问(我宁愿仅使用Python标准模块,而无需使用外部软件).实现这一目标的最优雅的方法是什么?
解决方法:
试试看-适用于2.7和3.2.
脚本:
import struct, collections
class CStruct(object):
def __init__(self, typename, format_defn, lead_char="!"):
self.names = []
fmts = [lead_char]
for line in format_defn.splitlines():
name, fmt = line.split()
self.names.append(name)
fmts.append(fmt)
self.formatstr = ''.join(fmts)
self.struct = struct.Struct(self.formatstr)
self.named_tuple_class = collections.namedtuple(typename, self.names)
def object_from_bytes(self, byte_str):
atuple = self.struct.unpack(byte_str)
return self.named_tuple_class._make(atuple)
if __name__ == "__main__":
# do this once
pkt_def = """ u1 B
u2 H
u4 I"""
cs = CStruct("Packet1", pkt_def)
# do this once per incoming packet
o = cs.object_from_bytes(b"\xF1\x00\xF2\x00\x00\x00\xF4")
print(o)
print(o.u4)
输出:
Packet1(u1=241, u2=242, u4=244)
244
内容总结
以上是互联网集市为您收集整理的如何使用Python优雅地发送/接收大型C结构?全部内容,希望文章能够帮你解决如何使用Python优雅地发送/接收大型C结构?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。