python - 如何在 python 3.2 中解压缩 c 结构?

标签 python c sockets struct python-3.x

我正在开发一个服务器(用 Python 实现)客户端(用 C 实现)应用程序。 我想在服务器端(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  

我认为问题出在我的解包方法的格式字符串 '<i 2048s' 中争论。

编辑:-

now, i have replaced format string '<i 2048s' with format string '<i 256s'

最佳答案

Lokesh,我不是 Python 专家,但在我看来你是在告诉 Python 的 struct 你有:

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

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

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

  • 一个整数,后跟以下之一:
    • 两个整数数组,每个数组包含 100 个元素
    • 一个包含 256 个元素的字符数组

现在,如果不查看将结构推送到线路上的 C 代码,就很难了解整数的字节顺序(网络字节顺序是大端)。但除此之外,您对 struct 的数据规范看起来是错误的。

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

关于python - 如何在 python 3.2 中解压缩 c 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14520023/

相关文章:

python - 在 jinja2 中转义引号

c - 什么是 "stack thrash"?

c - mystrlen 函数出错

c++ - 交叉编译一个automake项目?

c - 确定客户端绑定(bind)到的 TCP 端口号

python - 如何使用 lxml.html 库解析 HTML

python - 按第一列定义的间隔有效地平均第二列

python - python中两个列表混合的Round Robin方法

java - 一个简单的java客户端服务器程序

sockets - 是否有任何用于 nodejs 的 websocket 插件