我有一个结构,它有5个无符号8位整数,模仿一个包含5个数据包的帧。经过研究,我知道需要逐个字段地序列化数据,特别是因为我从Windows机器发送到Linux机器并返回。
这是我的结构:
typedef struct pressure{
UINT8 a;
UINT8 b;
UINT8 c;
UINT8 d;
UINT8 e;
}pressure;
问题是我不能使用htons(),因为我的成员必须是8位。如何手动序列化?如果您能提供一个简短的代码示例来展示如何序列化以及传递给send()的内容,将不胜感激。
答案 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);
会为您提供任何机器可读的固定长度字符串。最好有一些字段分隔符(本例中为“|”),以帮助接收方验证字符串没有被不可靠的网络乱码。