如何在python 3.2中解压缩c struct?

时间:2013-01-25 10:35:48

标签: python c sockets struct python-3.x

我正在研究服务器(用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'

2 个答案:

答案 0 :(得分:2)

有两个问题:

  • .recvfrom()返回(data, address)元组,您只需将数据传递给struct.unpack()

  • 您只能从套接字读取最多1024个字节,但解包格式需要2052个字节。从套接字读取,直到您首先收到足够的数据。

答案 1 :(得分:2)

Lokesh,我不是蟒蛇专家,但它让我觉得你在告诉python的 struct

  • 一个小端整数,后跟
  • 2048 char []

(基于http://docs.python.org/2/library/struct.html#format-characters

查看您的C结构定义,这根本不是您所拥有的。你有:

  • 一个整数,后跟一个:
    • 两个100个元素的整数数组
    • 一个256个元素的char数组

现在,在没有查看将结构推送到线路上的C代码的情况下,很难知道整数的字节顺序(网络字节顺序是大端的)。但除此之外,您对 struct 的数据规范看起来不对。

我猜测C结构中对union的解释将取决于 command 的内容。因此,您似乎需要首先检查命令,然后根据它为 struct 提供适当的格式字符串。请注意,在data / ttl情况下,您可能会遇到struct padding问题,因为客户端的编译器可能决定在数据 ttl 之间插入一些填充。数组,以满足对齐要求等。