自定义协议的 magic number 超过 8 字节,如何在大小端系统正确解释

65 天前
 proxytoworld

假如协议头: 0xDEADBEEFDEADBEEFEF 9 个字节,而用于网络和主机字节序转换的函数 htonl/ntohl 最多能转换一个 long 的长度即 8 个字节

那么如何在大小端系统中传输这个自定义协议数据时,如何保证都能正确解释这个协议头(能够正确判断协议头对,自定义协议基于 TCP )

期望:

结论:协议头正确

964 次点击
所在节点    问与答
10 条回复
leonshaw
65 天前
字节数组
darkengine
65 天前
补齐到 16 个字节
ysc3839
65 天前
别用 magic number ,用 magic bytes 即可
zhujinliang
65 天前
把它看作一个 long 和一个 char ,依次判断是否相等

要我就只判断前 8 个字节是否相等,第 9 个爱是啥是啥
proxytoworld
65 天前
@ysc3839 逐字节比较?
galenzhao
65 天前
char[]
galenzhao
65 天前
BingoXuan
65 天前
unsigned char data[] = {0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef,0xef};
const uint32_t a = ntohl(*(uint32_t *)data);
const uint32_t b = ntohl(*(uint32_t *)(data+4*sizeof(char)));
const uint32_t c = ntohl(*(uint32_t *)(data+5*sizeof(char)));
BingoXuan
65 天前
@BingoXuan
直接判断 a == 0xDEADBEEF && b == 0xDEADBEEF && c== 0xADBEEFEF
ihciah
65 天前
大小端是在将多个字节解释为单个 primitive type (例如 u32, u64, i32 等)时遇到的问题。
那么你现在需要将其理解为 u64 吗?并没有。所以不涉及大小端问题,直接逐 byte 比较即可。
嫌慢可以上 SIMD ,一些现成库有实现,编译器可能也能将其自动向量化。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1071939

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX