前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux基础(字节序是什么鬼)

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

作者头像
用户2617681
发布2019-08-08 11:07:10
2.7K0
发布2019-08-08 11:07:10
举报
文章被收录于专栏:秘籍酷

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

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

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

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

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

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

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

如果我们按照从左到右(即内存地址从小到大)来对应数值权位的话,那么最左边的0x78应该是这整个整数的最低位,而0x11是最高位。

完全相反,我们也可以这么解释这个变量:按照从右到左(即内存地址从大到小)来对应数值权位。那么如此一来高位数据和地位数据完全倒置过来,我们得出的整个数值当然就截然不同。

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

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

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

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

htons( ) 和 htonl( ) ntohs( ) 和 ntohl( )

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秘籍酷 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档