在我的实验室里有两个明确的目标:首先要明确我们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格式、操作它们并将它们发送给接收方的最简单方法是什么?在
您可以在正确连接的socket上使用
.recv
调用来接收数据包的50个字节(在TCP数据包不太可能出现碎片的情况下,实际上可能需要多个调用,因此请检查传入长度,直到您手头正好有50个字节;-)。在在那之后,理解C代码是令人费解的。将
int
s(大概每个4个字节)分配给Packet[9]
、Packet[13]
等等,给人的印象是,在Packet
内一次设置4个字节,但事实并非如此:每个赋值在包中只设置一个字节,从int
的最低字节开始,即赋值的RHS。但是这些字节是(int)(720000+armcontrolpacket->dof0_rot*1000)
的字节,等等。。。在那么,包的最后44个字节必须解释为11个4字节整数(有符号吗?未签名?)还是44个独立的价值观?我猜是前者,然后
格式
f
表示:big-endian,4个无符号字节值被两个忽略的“空闲”字节包围,11个4字节有符号整数。元组values
以15个值结束:4个单字节(在您的示例中是50、1、2、1),然后是11个有符号整数。您可以使用相同的格式字符串将元组的修改版本打包回一个50字节的数据包中以重新发送。在由于您显式地将长度放入数据包中,可能是不同的数据包具有不同的长度(尽管这与C示例中的固定长度声明不兼容),在这种情况下,您需要更准确地接收和解包它;但是这些详细信息取决于您没有提供的信息,所以我不想猜了;—)。在
看看struct module,特别是pack和unpack函数。它们与格式字符串一起工作,允许您指定要写入或读取的类型以及要使用的端点和对齐方式。在
相关问题 更多 >
编程相关推荐