【问题标题】:Deserializing C data反序列化 C 数据
【发布时间】:2011-08-26 19:26:12
【问题描述】:

我通过网络从 C 服务器到我的 Python 客户端接收结构。协议是UDP。我无法控制服务器及其协议/数据格式。它由这个结构组成(是的,一个 IPv4 + 端口):

struct ip_s {
    uint8_t i1;
    uint8_t i2;
    uint8_t i3;
    uint8_t i4;
    uint16_t port; // big endian
};

除了转换为大端序的端口外,数据按“原样”发送,转换为(char*)

我怎样才能将这个结构体接收为 Python 可处理的格式?


其他信息:

  • Python 2.7 或 3.x
  • 跨平台
  • 最好只使用内置模块的解决方案

【问题讨论】:

    标签: python networking udp deserialization


    【解决方案1】:

    查看struct.unpack

    它可能看起来像这样:

    # socket setup
    
    (buffer, sockaddress) = mysocket.recvfrom(6)
    if len(buffer)== 6:
        i1,i2,i3,i4, port = struct.unpack('!BBBBH', buffer)
    

    【讨论】:

    • 是的,询问后已经找到了,但我将把问题留在这里以供进一步参考。
    • 哦,"BBBBH" 应该是 "!BBBBH" 用于大端端口。
    【解决方案2】:

    我正在通过网络接收结构

    停在那里。不要那样做。该技术引入了以下依赖项:

    1. 字序:big-endian 或 little-endian。
    2. 填充。
    3. 包装。

    (2) 和 (3) 依次取决于:

    1. 编译器。
    2. 编译器版本。
    3. 周围的#pragmas。
    4. 编译 C 程序时生效的编译器选项。

    这是相当多的依赖关系。不要这样做。定义一个应用协议并使用它。或者使用 XDR 之类的工具为您解决问题。

    【讨论】:

    • 也许你不应该“停在那里”,至少不应该阅读:I have no control over the server and it's protocols/data formats.
    • @nightcracker 所以要么服务器设计不称职,需要有人控制,要么更可能的是,这只是描述应用程序协议的一种方式,它实际上是一个由以下组成的有线协议四个八位字节后跟一个网络字节顺序的两个八位字节整数。
    • 你的描述和我的没有区别,因为实现使用uint8之类的,没有留出实现的空间。我对服务器的设计很执着,它是基于this code 的 CoD4 主服务器。
    猜你喜欢
    • 1970-01-01
    • 2016-05-14
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多