Python和C++套接字转换包D

2024-10-03 09:09:59 发布

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

在我的实验室里有两个明确的目标:首先要明确我们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格式、操作它们并将它们发送给接收方的最简单方法是什么?在


Tags: 程序目标定义packetspare实验室lengthint
2条回答

您可以在正确连接的socket上使用.recv调用来接收数据包的50个字节(在TCP数据包不太可能出现碎片的情况下,实际上可能需要多个调用,因此请检查传入长度,直到您手头正好有50个字节;-)。在

在那之后,理解C代码是令人费解的。将ints(大概每个4个字节)分配给Packet[9]Packet[13]等等,给人的印象是,在Packet内一次设置4个字节,但事实并非如此:每个赋值在包中只设置一个字节,从int的最低字节开始,即赋值的RHS。但是这些字节是(int)(720000+armcontrolpacket->dof0_rot*1000)的字节,等等。。。在

那么,包的最后44个字节必须解释为11个4字节整数(有符号吗?未签名?)还是44个独立的价值观?我猜是前者,然后

import struct
f = '>x4bx11i'
values = struct.unpack(f, packet)

格式f表示:big-endian,4个无符号字节值被两个忽略的“空闲”字节包围,11个4字节有符号整数。元组values以15个值结束:4个单字节(在您的示例中是50、1、2、1),然后是11个有符号整数。您可以使用相同的格式字符串将元组的修改版本打包回一个50字节的数据包中以重新发送。在

由于您显式地将长度放入数据包中,可能是不同的数据包具有不同的长度(尽管这与C示例中的固定长度声明不兼容),在这种情况下,您需要更准确地接收和解包它;但是这些详细信息取决于您没有提供的信息,所以我不想猜了;—)。在

看看struct module,特别是pack和unpack函数。它们与格式字符串一起工作,允许您指定要写入或读取的类型以及要使用的端点和对齐方式。在

相关问题 更多 >