如何序列化一个8位整数的结构用于套接字编程
How do I serialize a struct of 8bit integers for socket programming?
我有一个结构,它有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);
会给你一个任何机器都能读取的固定长度的字符串。最好使用某种字段分隔符(本例中为"|")来帮助接收器验证字符串是否被不可靠的网络篡改。
相关文章:
- Qsort() 比较结构体整数的总和
- 如何修改此函数,以便如果函数的参数是特定结构,则返回具有较大整数的结构?
- boost::任何带有结构体和无符号整数
- 如何在 C++11 编译时构建具有递增值的整数成员的结构序列
- 结构上溢出的整数加法
- 如何将结构名称更改为整数?
- 从低到高组织整数并在C++中使用结构
- 结构中的整数、字符和浮点数
- C 中的内存模型:为什么在同一内存位置分配了结构中的两个整数
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 在指向结构的指针中访问指向整数的指针
- C MPI创建并发送具有字段char [16]和整数的结构数组
- C++ - 泛型结构的成员在分配双精度时给出错误的值(但适用于整数)
- 在英特尔x86体系结构上使用非AVX指令修改xmm整数寄存器值
- 在处理结构模板中的整数时如何修复"X 不是类模板"?
- 可用于存储和管理整数集合的最佳C++数据结构是什么
- 哪种数据结构和设计用于选择最佳整数集
- 为什么使用 24 位整数时结构大小不会改变
- 将整数结构转换为位掩码
- 如何将整数结构初始化为零