首先,澄清我的目标:在我们的实验室中存在两个用C语言编写的程序。我正在为它们(它还将主要模拟数据)的代理服务器(双向)工作。我想用Python编写代理服务器。重要的是要知道我对这两个程序几乎一无所知,我只知道数据包的定义文件。
现在:假设其中一个C ++程序中的数据包定义如下所示:
unsigned char Packet[0x32]; // Packet[Length]
int z=0;
Packet[0]=0x00; // Spare
Packet[1]=0x32; // Length
Packet[2]=0x01; // Source
Packet[3]=0x02; // Destination
Packet[4]=0x01; // ID
Packet[5]=0x00; // Spare
for(z=0;z<=24;z+=8)
{
Packet[9-z/8]=((int)(720000+armcontrolpacket->dof0_rot*1000)/(int)pow((double)2,(double)z));
Packet[13-z/8]=((int)(720000+armcontrolpacket->dof0_speed*1000)/(int)pow((double)2,(double)z));
Packet[17-z/8]=((int)(720000+armcontrolpacket->dof1_rot*1000)/(int)pow((double)2,(double)z));
Packet[21-z/8]=((int)(720000+armcontrolpacket->dof1_speed*1000)/(int)pow((double)2,(double)z));
Packet[25-z/8]=((int)(720000+armcontrolpacket->dof2_rot*1000)/(int)pow((double)2,(double)z));
Packet[29-z/8]=((int)(720000+armcontrolpacket->dof2_speed*1000)/(int)pow((double)2,(double)z));
Packet[33-z/8]=((int)(720000+armcontrolpacket->dof3_rot*1000)/(int)pow((double)2,(double)z));
Packet[37-z/8]=((int)(720000+armcontrolpacket->dof3_speed*1000)/(int)pow((double)2,(double)z));
Packet[41-z/8]=((int)(720000+armcontrolpacket->dof4_rot*1000)/(int)pow((double)2,(double)z));
Packet[45-z/8]=((int)(720000+armcontrolpacket->dof4_speed*1000)/(int)pow((double)2,(double)z));
Packet[49-z/8]=((int)armcontrolpacket->timestamp/(int)pow(2.0,(double)z));
}
if(SendPacket(sock,(char*)&Packet,sizeof(Packet)))
return 1;
return 0;
接收数据的最简单方法是什么,将其转换为可读的python格式,操纵它们并将它们发送到接收方?
答案 0 :(得分:4)
在正确连接的socked上,你可以通过.recv
调用接收数据包的50个字节(在TCP数据包被分割的不太可能的情况下,它可能实际上需要多次调用,因此请检查传入的长度,直到准确手持50个字节; - )。
之后,了解C代码令人费解。将int
s(可能每个4字节)分配给Packet[9]
,Packet[13]
等,给人的印象是意图是在{{1}内一次设置4个字节但是,这不是发生的事情:每个赋值都在数据包中设置一个字节,从Packet
的最低字节开始,即赋值的RHS。但这些字节是int
的字节,依此类推......
那么数据包的最后44个字节必须被解释为11个4字节整数(有符号?无符号?)或44个独立值?我会猜测前者,然后......:
(int)(720000+armcontrolpacket->dof0_rot*1000)
格式import struct
f = '>x4bx11i'
values = struct.unpack(f, packet)
表示:big-endian,4个无符号字节值,由两个被忽略的“备用”字节包围,11个4字节有符号整数。元组f
最终得到15个值:四个单字节(在您的示例中为50,1,2,1),然后是11个有符号整数。您可以使用相同的格式字符串将元组的修改版本打包回50字节的数据包以重新发送。
由于您明确地将长度放在数据包中,因此可能不同的数据包具有不同的长度(尽管这与C示例中的固定长度声明不兼容),在这种情况下,您需要在接收时更准确一些打开包装;但是这些细节取决于你没有给出的信息,所以我会停止尝试猜测; - )。
答案 1 :(得分:3)
查看struct module,特别是打包和解包功能。它们使用格式字符串,允许您指定要写入或读取的类型以及要使用的字节顺序和对齐方式。