繁体   English   中英

Raspberry Pi上的endianess问题

[英]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 ),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 )!

是什么给这个? 我疯了吗? 我对结构体内的字节顺序完全错了吗? (这是一个明确的可能性)

结构中的字段顺序,然后是多字节字段中的字节顺序。

0x003C根本不是字节序,它是60的十六进制值。当然,它以一些字节顺序存储在内存中,但是你用来写字段的顺序和用来读取它的顺序是相同的 - 两者都是是Raspberry Pi的本机字节顺序,它们取消了。

通常你会想写:

ip->tot_len = htons(60);

将16位字段存储到数据包中时。 还有用于32位字段的htonl ,以及用于从网络数据包读取字段的ntohsntohl

ARM体系结构可以运行小端和大端,但Android平台运行小端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM