自定义缓冲区的字节顺序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义缓冲区的字节顺序相关的知识,希望对你有一定的参考价值。

我想发送具有此结构的有效负载:

uint8_t  num_of_products;
//1 product
   uint8_t  action;
   time_t unix_time;//uint64_t
   uint32_t name_len;//up to 256
   char* name;
   uint8_t num_of_ips;
   //1 ip out if num_of_ips
      uint8_t ip_ver; //0 error , 1 ipv4 , 2 ipv6
      char* IP;// ipv4 : 4 , ipv6 : 16

在发送数据包之前,我使用memcpy将产品聚合成巨型mbuf

从测试我做name_len必须通过hton才能在wireshark中看起来“倒”。

我的问题是,我可以应用什么逻辑来获得具有未知大小的内部变量的自定义结构的字节顺序

什么应该通过什么应该留下的原因

答案

如果您的目标是以网络字节顺序(大端字节)显示消息,则只有占用多个字节的整数字段才需要htonl treamnet。在你的情况下,那将是time_t unix_timeuint32_t name_len。您的字符串和单字节字段(例如num_of_products)不需要任何特定的转换。

正如您问题中的一些评论者所建议的那样 - 如果您想使用严格的网络字节顺序,那将由您决定。如果您希望代码在不同平台上运行,那么将消息序列化以具有严格的字节顺序非常有用。

编写有效的字节打包代码非常困难。最后编写了大量代码,以节省几个字节的网络带宽。

用户jxh提到JSON是您邮件的可能编码。不知道为什么他删除了他的答案,因为它是关键。但无论如何,在wireshark和调试时,JSON或XML(或任何ascii文本模式)的标准消息传递格式更容易被观察到100倍。

以上是关于自定义缓冲区的字节顺序的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL没有将最近的片段绘制到相机

VSCode自定义代码片段——CSS选择器

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——CSS动画

VSCode自定义代码片段(vue主模板)