【发布时间】:2012-10-01 23:31:47
【问题描述】:
我刚刚开始使用 C++ 进行一些原始网络编程,并且一直在我的 Raspberry Pi 上进行编译(没有交叉编译)。这使得一切都是小端的。
在构建 IP 标头后,我计算了 IP 校验和,但结果总是不正确(基于此处的示例 http://www.thegeekstuff.com/2012/05/ip-header-checksum/)。
加快 gdb,我已将问题解决到 IP 标头中前 32 位的顺序。该示例使用 0x4500003C,表示版本 4 (0x4)、IHL 5 (0x5)、TOS 0 (0x00) 和 tot_length 60 (0x003C)。所以我设置了我的数据包。
struct iphdr* ip; // Also some mallocing
ip->version = 4;
ip->ihl = 5;
ip->tos = 0;
ip->tot_len = 60;
现在在 gdb 中,我检查了前 32 位,由于字节顺序,我期待 0x3C000045,但我得到了这个:
(gdb) print ip
$1 = (iphdr *) 0x11018
(gdb) x/1xw 0x11018
0x11018: 0x003c0045
前 16 位是小端 (0x0045),但第二个包含十进制 60,似乎是大端 (0x003C)!
这是什么?我疯了吗?我对结构内的字节顺序完全错误吗? (绝对有可能)
【问题讨论】:
-
与你的问题完全无关 - 怎么样 - 想买一个 ;-)
-
去做吧! 3000 美分中的每一分都值得
标签: c++ endianness