我在一个服务器(用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数组之间插入一些填充,以满足对齐要求等。

10-06 05:19
查看更多