linux基础是什么,Linux基础(字节序是什么鬼)

本文介绍了计算机通信中的字节序概念,包括大端序和小端序,并解释了它们在网络编程中的重要性。通过《格列佛游记》的故事背景引入,使读者了解不同字节序在实际应用中的意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在刚刚结束的佛职院实训项目中,涉及有关网络编程的概念,有一两个同学在Q上问到字节序的问题,今天就这个话题,来详细聊聊字节序这个小鬼究竟是啥意思。

首先,所谓的字节序有两种情况:大端序和小端序,怎么个意思呢? 先来背两个单词:big endian 和little endian。正是他们,分别被翻译为专业术语大端序和小端序。而这两个英文单词的原意,我们用一幅图来表示:

a5eaf50eb063481db0bfbb5eaa096d7b.jpg

是的,最开始的时候,大小端指的是鸡蛋的两头,一头大一头小。《格列佛游记》中记载了两个征战的强国,你不会想到的是,他们打仗竟然和剥鸡蛋的姿势有关。

很多人认为,剥鸡蛋时应该打破鸡蛋较大的一端,这群人被称作“大端(Big endian)派”。可是当今皇帝的祖父小时候吃鸡蛋的时候碰巧将一个手指弄破了。所以,他的父亲(当时的皇帝)就下令剥鸡蛋必须打破鸡蛋较小的一端,违令者重罚,由此产生了“小端(Little endian)派”。

老百姓们对这项命令极其反感,由此引发了6次叛乱,其中一个皇帝送了命,另一个丢了王位。据估计,先后几次有11000人情愿受死也不肯去打破鸡蛋较小的一端!

782705ced0904d4480bbb46ad2da5801.jpg

看到没有,仅仅是剥鸡蛋就能产生这么大的分歧,“大端”和“小端”有这么重要嘛!

的确有这么重要,尤其在计算机通信中,你想想看,假设我们有一个整型变量有8个字节,那么这8个字节的个十百千万的权位究竟是从左向右的还是从右向左的,就显得非常关键!不同的解释顺序将会导致数值完全不同。看下图:

注意到,对一个多字节变量的权位的不同解释方式,就是所谓字节序。而且,这些不同的解释方式,只是各种CPU本身的运算特性,跟内存中的数据存储是没有关系的,所以在同一台计算机内部,所有的数据都由同一CPU的同一种解释方式来执行,因此单机程序我们根本不需要管它是什么字节序,CPU自己能认识自己的处理逻辑就可以了。

蛋是可是蛋可是,一旦数据在网络中传输,问题就来了,因为网络中互相通信的两台计算机的CPU很有可能是异构的,也就是说他们对同一个多字节的整型变量的解释方向是很可能相反的! 那我们如果不闻不问,就必然会出问题!

那怎么办呢?既然我们无法得知对方的的字节序,我们就做出如下规定:凡是向网络发送数据,一律转成大端序。 有了这个规定,通信双方就心里有谱啦!看我的手绘图:

4cf1fe2d05f147a69bf8fd4510499f5d.jpg

这就是为什么在网络编程中,通常都会看到以下这两个函数:

htons( ) 和 htonl( )

ntohs( ) 和 ntohl( )

其中,h代表host(即本地主机),n代表network(即网络),s代表short(即16位短整型),l代表long(即32位长整型)。例如,htons( )就是专门用来将本地主机16位短整型数据转化为网络字节序的。

现在,该明白什么是字节序,以及单机编程不需要考虑它,而网络编程需要考虑了吧。

8cc1d2bb95274c2896cab679d9753da9.jpg

70344071c48748d4ab3a35f6f98effe9.jpg

8d10fd57fdda402d94f750bf7a22f6ff.jpg

dfbc7f5e40a44732a457de132b612233.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值