自定义缓冲区的字节顺序

时间:2018-03-05 09:09:54

标签: c++ c networking

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

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中看起来“倒”。

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

,应该通过什么应该留下什么

1 个答案:

答案 0 :(得分:2)

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

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

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

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