我正在研究服务器(用Python实现)客户端(用C实现)应用程序。 我想在服务器端使用struct模块解压缩从C客户端接收的原始字节(Python)。
我的C结构(来自C客户端):
typedef struct lokesh{
int command;
union
{
struct{
int data[100];
int ttl[100];
};
struct{
char config[256];
};
};
} mystructdata;
在服务器端解压缩(Python): -
import struct
data,address=socket.recvfrom(1024)
result=struct.unpack('<i 2048s',data)
print(result[0])
但是我收到了一个错误: -
struct.error: unpack require object of size 2052
我认为问题在于我的unpack方法的格式字符串'<i 2048s'
参数。
编辑: -
现在,我已经用格式字符串替换格式字符串
'<i 2048s'
'<i 256s'
答案 0 :(得分:2)
有两个问题:
.recvfrom()
返回(data, address)
元组,您只需将数据传递给struct.unpack()
。
您只能从套接字读取最多1024个字节,但解包格式需要2052个字节。从套接字读取,直到您首先收到足够的数据。
答案 1 :(得分:2)
Lokesh,我不是蟒蛇专家,但它让我觉得你在告诉python的 struct :
(基于http://docs.python.org/2/library/struct.html#format-characters)
查看您的C结构定义,这根本不是您所拥有的。你有:
现在,在没有查看将结构推送到线路上的C代码的情况下,很难知道整数的字节顺序(网络字节顺序是大端的)。但除此之外,您对 struct 的数据规范看起来不对。
我猜测C结构中对union的解释将取决于 command 的内容。因此,您似乎需要首先检查命令,然后根据它为 struct 提供适当的格式字符串。请注意,在data / ttl情况下,您可能会遇到struct padding问题,因为客户端的编译器可能决定在数据和 ttl 之间插入一些填充。数组,以满足对齐要求等。