把记录传给a s

2024-05-15 11:32:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python和Delphi代码之间建立了基本的socket通信(仅文本)。现在我想发送/接收双方的数据记录。我有一个“C兼容”的记录,并且希望在python中以可用的格式来回传递记录。在

我用连接发送(“text”)在python中发送文本,但是如何使用python发送/接收缓冲区并访问python中发送的记录项?在

记录

  TPacketData = record
    pID      : Integer;
    dataType : Integer;
    size     : Integer;
    value    : Double;
  end;

Tags: 数据代码text文本sizevalue格式记录
2条回答

我知道这个答案有点晚了,但至少对其他在搜索结果中找到这个问题的人是有用的。因为你说Delphi代码发送和接收“C兼容的数据”,似乎为了回答Python的处理,它与另一端的Delphi(或任何其他语言)无关。。。在

pythonstructsocket模块具有您描述的基本用法的所有功能。要发送示例记录,请执行如下操作。为了简单和健全,我假定有符号整数和双精度,并将数据打包为“网络顺序”(bigendian)。这很容易成为一行代码,但为了冗长和可重用性的原因,我将其拆分:

import struct
t_packet_struc = '>iiid'
t_packet_data = struct.pack(t_packet_struc, pid, data_type, size, value)
mysocket.sendall(t_packet_data)

当然,如果对格式字符串、数据准备等进行了调整,则不需要进行上述“假定”。有关可能的格式字符串的描述,请参阅struct内联帮助-它甚至可以处理Pascal字符串之类的内容。。。顺便说一句,socket模块允许打包和解包一些struct没有的特定于网络的东西,比如IP地址字符串(到它们的bigendian int blob格式),并允许显式函数将数据bigendian转换为native,反之亦然。为了完整起见,下面是如何在Python端解压上面打包的数据:

^{pr2}$

我知道这在pythonversion2.x中是可行的,并且怀疑它在pythonversion3.x中也可以正常工作。小心一个大问题(因为很容易不去思考,而且事后很难排除):除了不同的结尾,您还可以区分使用“标准大小和对齐方式”(可移植)或使用“本机大小和对齐方式”(更快)进行打包,这取决于您如何给格式字符串加前缀(或不加前缀)。这些通常会产生与你预想的大不相同的结果,而不会告诉你为什么。。。(有龙)。在

我对Python了解不多,但我在Delphi、C++、Cype和java之间做了很多事情,甚至是用COBOL。

无论如何,要先从Delphi向C发送一条记录,您需要在两端打包该记录

在德普希

MyRecord = pack record
< C++ > /P> ^{pr2}$

我不知道在python中,但我想肯定有一个类似的。确保两边的sizeof(MyRecord)的长度相同。

另外,在发送记录之前,您应该注意字节顺序(您知道,小端和大端),使用插座.htonl()和插座.ntohl()在python中,以及在Deplhi中的等效值,它们在WinSock单元中。另外,Delphi中的“double”不能与python中的相同,在Delphi中是8字节,也可以检查这个,并将其更改为Single(4字节)或Extended(10字节),以匹配的为准。 如果所有这些都匹配,那么您可以一次关闭发送/接收二进制记录,否则,恐怕您必须逐个发送各个字段。

相关问题 更多 >