反序列化 C 数据

发布于 2024-11-07 11:11:19 字数 422 浏览 0 评论 0原文

我正在通过网络从 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
  • 跨平台
  • 最好仅使用内置模块的解决方案

I'm receiving a struct over a network from a C server to my Python client. The protocol is UDP. I have no control over the server and it's protocols/data formats. It consists of this struct (yes, an IPv4 + port):

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

Apart from the port which is converted to big-endian the data is sent "as-is", casted to a (char*).

How can I receive this struct to a format that is processable by Python?


Misc info:

  • Python 2.7 or 3.x
  • Cross-platform
  • Preferably solution using only built-in modules

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

吹梦到西洲 2024-11-14 11:11:19

查看 struct.unpack

它可能看起来像这样:

# socket setup

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

Look into struct.unpack

It will probably look something like this:

# socket setup

(buffer, sockaddress) = mysocket.recvfrom(6)
if len(buffer)== 6:
    i1,i2,i3,i4, port = struct.unpack('!BBBBH', buffer)
冬天旳寂寞 2024-11-14 11:11:19

我正在通过网络接收一个结构

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

  1. 字序:大端或小端。
  2. 填充。
  3. 包装。

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

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

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

I'm receiving a struct over a network

Stop right there. Don't do that. This technique introduces the following dependencies:

  1. Word order: big-endian or little-endian.
  2. Padding.
  3. Packing.

(2) and (3) in turn depend on:

  1. The compiler.
  2. The compiler version.
  3. The surrounding #pragmas.
  4. The compiler options in effect when the C program was compiled.

That's rather a lot of dependencies. Don't do this. Define an application protocol and use it. Or use something like XDR that solves the problem for you.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文