如何序列化一个8位整数的结构用于套接字编程

How do I serialize a struct of 8bit integers for socket programming?

本文关键字:整数 结构 用于 编程 套接字 8位 一个 序列化      更新时间:2023-10-16

我有一个结构,它有5个无符号的8位整数,模拟了一个有5个数据包的帧。经过研究,我知道需要一个字段一个字段地序列化数据,尤其是因为我要从Windows机器发送到Linux机器,然后再发送回来。

这是我的结构:

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

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

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

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

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

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

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

然而,如果你计划将其发送到基于另一个处理器的机器上,最安全的事情就是只发送ASCI字符,比如:

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

会给你一个任何机器都能读取的固定长度的字符串。最好使用某种字段分隔符(本例中为"|")来帮助接收器验证字符串是否被不可靠的网络篡改。