为什么是这样?
请大家思考一个问题:
现在有一个整数:0x12345678,把它放在一个4字节的整型变量中,那第一个字节里面存放的是什么?是0x12还是0x78?
这其实就引出了计算机中存放数据的两种方式:大端模式和小端模式。
在大端模式中,高位的数据存放在低地址,比如上面那个整数中,12表示的是整数的高位,那它存放在一开始的位置(低地址),如此一来,在大端模式下,内存存放顺序和我们书写这个整数的顺序是一致的。
而小端模式下,则刚好反过来,存放的顺序和我们书写的顺序相反。
有一道经常出现在各种笔试面试中的题目:如何判断当前计算机是大端模式还是小端模式。
知道了大端和小端的区别,相信你将能看懂下面这个答案:
#include
int main ()
{
unsigned int x = 0x12345678;
char *c = (char*)&x;
if (*c == 0x78) {
printf("Little endian");
} else {
printf("Big endian");
}
return 0;
}
有的计算机使用大端,有的计算机使用小端,那他们怎么通信啊,不得出问题?
网络的发明人们当然也想到了这个问题,所以在RFC1700中规定,在网络通信中一律使用大端模式。
比如在TCP中,端口是2个字节,对于Web服务端80端口,我们用十六进制书写是:0x0050,在网络中使用大端模式,数据和我们书写顺序一致,也是 00 50
但如果你在程序中查看却发现是反过来的:
这是因为我们电脑x86架构使用的是小端模式。
最近,知识星球的第二期学习活动:手写一个抓包软件,正在火热进行当中,在处理pcap数据包文件过程中,很多小伙伴儿都被这个字节序问题搞得晕头转向。
不过活动进行到了第七天,大家还是一路坚持了过来,而且坚持的人数比去上次手写一个Web服务器多了不少:
第1天
:学习二进制文件基本读写操作
第2天
:学习内存映射文件操作
第3天
:pcap文件格式学习
第4-5天
:pcap文件解析
第6天
:解析以太网协议
第7天
:解析IP协议报文
······
大家用着不同的编程语言,有C、C++、Python、Java、Go···去实现同一个功能,随着一点点迭代,一点点完善,去完成自己的一个抓包软件,在这个过程中一边学习编程,一边学习网络,是一次难得的综合实践,这比单纯的看书看视频学习要扎实深刻的多。
给大家看看几位优秀同学的代码:
C++版本的:
C#版本的:
Python版本的:
Go语言版本的:
与优秀的人一起同行,才能走的更快更稳,欢迎大家加入进来,一起来一场计算机网络和计算机编程的冒险之旅!