【问题标题】:How do I serialize a struct of 8bit integers for socket programming?如何为套接字编程序列化 8 位整数结构?
【发布时间】:2015-05-06 07:04:50
【问题描述】:

我有一个结构,它有 5 个无符号 8 位整数,它模拟一个包含 5 个数据包的帧。经过研究,我知道需要逐个字段序列化数据,特别是因为我要从 Windows 机器发送到 Linux 机器并返回。

这是我的结构:

typedef struct pressure{
    UINT8       a;
    UINT8       b;
    UINT8       c;
    UINT8       d;
    UINT8       e;
}pressure;

问题是我不能使用 htons() 因为我的成员必须是 8 位。我如何手动序列化它?如果您能提供一个简短的代码示例来说明如何序列化以及传递给 send() 的内容,我们将不胜感激。

【问题讨论】:

    标签: c++ sockets serialization struct


    【解决方案1】:

    您可以使用 ostream::put 写入每个单独的字节,或者 - 如果您确保它们在内存中的 pressure 中是连续的(这将在我曾经使用过的每个编译器上完成,而无需您主动执行任何操作) - 使用ostream::write 编写其中的很多内容,如:

    my_ostream.write(static_cast<const char*>(&my_pressure.a), 5);
    

    也就是说,考虑将值保存在数组中,这样可以保证它们在内存中是连续的。

    您不需要 htonX / ntohX 等 - 它们用于规范化/非规范化 多字节 整数表示,而这里没有。

    【讨论】:

      【解决方案2】:

      如果您要从基于 Intel x86 的机器发送到另一台 Intel x86 机器(大多数 linux 都是),只需编写它。

      但是,如果您打算将其发送到基于另一个处理器的机器上,最安全的做法是只发送 ASCI 字符,例如:

       char[] buffer = sprintf("|%03d|%03d|%03d|%03d|%03d|",a,b,c,d,e);
      

      会给你一个固定长度的字符串,任何机器都可以读取。使用某种字段分隔符(在这种情况下为“|”)来帮助接收者验证字符串没有被不可靠的网络弄乱是一个好主意。

      【讨论】:

      • uint8s 在所有计算机上都是相同的,没有被误解的危险。
      • 在 DEC VAX 上肯定不同!
      • 不同如何?通过 TCP/IP 网络向 VAX 发送 8 位值的程序是否可以看到这种差异?
      • @Jeremy -- 啊,你可能在 DEC cpus 上写了奇怪的字节顺序。
      猜你喜欢
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 2015-07-07
      • 2013-11-28
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 2019-05-29
      相关资源
      最近更新 更多