树莓派上的endianes问题
Problems with endianess on Raspberry Pi
我刚刚开始用C++进行一些原始网络编程,并且一直在我的Raspberry Pi上进行编译(没有交叉编译)。这让一切都变得微不足道。
在构造IP标头后,我计算了IP校验和,但结果总是不正确(基于这里的示例http://www.thegeekstuff.com/2012/05/ip-header-checksum/)。
在升级gdb时,我已经将问题归结为IP头中前32位的顺序。该示例使用0x4500003C
,表示版本4(0x4
)、IHL5(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
)!
这是什么?我疯了吗?我对结构中的字节顺序完全错了吗?(肯定有可能)
结构中有字段的顺序,然后是多字节字段中的字节顺序。
0x003C
根本不是endian,它是60的十六进制值。当然,它是以一些endianness存储在内存中的,但写入字段的顺序和读取字段的顺序是相同的——两者都是Raspberry Pi的原生字节顺序,它们相互抵消。
通常你会想写:
ip->tot_len = htons(60);
当将16比特字段存储到分组中时。还有htonl
用于32位字段,ntohs
和ntohl
用于从网络数据包中读取字段。
ARM体系结构可以运行小端和大端,但Android平台运行小端。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 树莓派上的endianes问题