【问题标题】:How to unpack c struct in python 3.2?如何在 python 3.2 中解压 c 结构?
【发布时间】:2013-01-25 10:35:48
【问题描述】:

我正在开发一个服务器(用 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  

我认为问题出在我的 unpack 方法的格式字符串 '&lt;i 2048s' 参数中。

编辑:-

现在,我已将格式字符串 '&lt;i 2048s' 替换为格式字符串 '&lt;i 256s'

【问题讨论】:

  • 为什么没有任何一种(至少是半)标准化的通信格式适合您的问题?有一个 Google 的 Protocol Buffers - 它非常有效,并且有许多语言的库......
  • 我的控制只在服务器端..即解包/解码,不能在客户端做任何事情。

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


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 先生,我认为命令内容将决定联合结构选择是对的。但是,我想知道我正在使用正确的格式字符串表达式.... if(command==union_1_selection) then : format_string= '
  • ..我解决了我的上述问题,实际上问题在于我的 unpack 方法的格式化字符串参数,我将其替换为 :---> struct.unpack("&lt;i 800s",data) ,因为联合大小将是:- 2( 100x4) = 800 秒
【解决方案2】:

有两个问题:

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

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

【讨论】:

  • 先生,是的,我现在已经更正了第一点。但是在指定 2052 字节时出现错误:--> struct.error: unpack require object of size 2056
  • @LokeshKumar:我没有说你的结构模式应该调整。 i 整数是 4 个字节,您需要 2048 个字符,每个 1 个字节。总大小2052字节,所以需要传递unpack 2052 data字节。
猜你喜欢
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 2022-12-07
相关资源
最近更新 更多