我在一个服务器(用Python实现)客户机(用C实现)应用程序上工作。
我想使用服务器端的struct模块(Python)解压从C客户机接收的原始字节。
我的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
我认为问题出在解包方法的格式string
'<i 2048s'
参数中。编辑:-
现在,我用format string替换了format string
'<i 2048s'
最佳答案
洛克什,我不是一个python专家,但在我看来,你好像在告诉python的struct:
一个尾数整数,后跟
2048字符[]
(基于http://docs.python.org/2/library/struct.html#format-characters)
看看你的C结构定义,这根本不是你所拥有的。你有:
一个整数,后跟:
两个100个元素的整数数组
一个由256个元素组成的字符数组
现在,如果不看将结构推到连线上的C代码,就很难知道整数的端序(网络字节顺序是大端序)。但撇开这一点不谈,您对结构的数据规范看起来是错误的。
我猜C结构中union的解释将取决于命令的内容。因此,您似乎需要首先检查命令,然后基于此为struct生成适当的格式字符串。注意,在data/ttl情况下,您可能会遇到结构填充问题,因为客户端的编译器可能会决定在数据和ttl数组之间插入一些填充,以满足对齐要求等。