如何为套接字编程序列化8位整数结构?

时间:2015-03-05 02:22:30

标签: c++ sockets serialization struct

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

这是我的结构:

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

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

2 个答案:

答案 0 :(得分:3)

您可以使用ostream::put编写每个字节,或者 - 如果您确保它们在pressure的内存中是连续的(这将在我曾经使用过的每个编译器上完成你正在积极地做任何事情) - 用ostream::write写下它们,如:

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

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

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

答案 1 :(得分:0)

如果您要从基于Intel x86的计算机发送到另一台Intel x86计算机(大多数Linux用户),请写一下。

但是,如果您计划将其发送到基于其他处理器的计算机,最安全的方法是发送ASCI字符,如下所示:

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

会为您提供任何机器可读的固定长度字符串。最好有一些字段分隔符(本例中为“|”),以帮助接收方验证字符串没有被不可靠的网络乱码。