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

Posted 秘籍酷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux基础(字节序是什么鬼)相关的知识,希望对你有一定的参考价值。

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




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

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


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


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

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

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


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



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


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


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

Linux基础(字节序是什么鬼)
这就是为什么在网络编程中,通常都会看到以下这两个函数:

htons( ) 和 htonl( )

ntohs( ) 和 ntohl( )


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


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

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

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

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

以上是关于Linux基础(字节序是什么鬼)的主要内容,如果未能解决你的问题,请参考以下文章

Linux网络编程基础API

《Linux高性能服务器编程》学习总结——Linux网络编程基础API

Linux网络编程初步

linux基础夯实之磁盘分区原理知识

第一篇文章-linux基础

为啥位字节序是位域中的一个问题?