为什么是这样?

编程技术宇宙

共 1116字,需浏览 3分钟

 ·

2022-05-19 23:14

请大家思考一个问题:

现在有一个整数: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语言版本的:

与优秀的人一起同行,才能走的更快更稳,欢迎大家加入进来,一起来一场计算机网络和计算机编程的冒险之旅!


浏览 29
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报