专栏首页秘籍酷Linux基础(字节序是什么鬼)

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

在刚刚结束的佛职院实训项目中,涉及有关网络编程的概念,有一两个同学在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位短整型数据转化为网络字节序的。

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

本文分享自微信公众号 - 秘籍酷(mijiku040),作者:林世霖

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C语言(跳转语句中的流氓)

    从上面的代码看到goto的语法很简单,就是直接跳转到指定的标签处,所谓的标签(如例子中的label)指的是后面带一个冒号的标识符。

    用户2617681
  • C语言(不明觉厉的cv限定词)

    以上对话虽然是杜撰的,但也绝非空穴来风,的的确确有类似的面试场景,我们不要笑话别人,也不能允许以后被别人笑话。比如上述对话中提到的cv限定词,现在就得立刻马上就...

    用户2617681
  • (4.20)C语言(预处理)

    首先,预处理语句严格来讲并不是C语言,编译的时候也不由编译器来处理,而是由预处理器分析和处理。

    用户2617681
  • 3.11VR扫描:Nreal将于2020 Q4发布一体式企业AR头显

    (VRPinea 3月11日电)今日重点新闻:Nreal将于2020 Q4发布一体式企业AR头显;苹果为 iOS14 开发全新AR App,代号Gobi;达摩院...

    VRPinea
  • 【学习】数据可视化6步法

    在当前互联网,各种数据可视化图表层出不穷,本文尝试对数据可视化的方法进行归纳,整理成6步法。 一般的数据图表都可以拆分成最基本的两类...

    小莹莹
  • 无人机的通用语言,你懂吗?

    小型无人机通信协议MAVLink解析 0、目录 1、概述 2、数据帧介绍 3、消息(PAYLOAD)介绍 4、举个栗子 5、传输性能介绍 6、缩略语 1、概述 ...

    机器人网
  • 适用于Java开发人员的微服务:管理安全性和机密

    安全性是现代软件系统中非常重要的元素。这是一个巨大的话题,它包含了很多不同的方面,不应该是事后才想到的。要把每件事都做好是很困难的,特别是在分布式微服务体系结构...

    麦洛
  • 这20个正则表达式,让你少写1000行代码

    正则表达式——古老而又强大的文本处理工具。仅用一段简短的表达式语句,就能快速地实现一个复杂的业务逻辑。掌握正则表达式,让你的开发效率有一个质的飞跃。 正则表达式...

    老九君
  • [高大上的DL]经典网络模型总结之AlexNet篇

    为了不让大家以为我这两天没学习的假象(shi shi),决定今天一定要更新一下了! 之前基本把卷积神经网络的内容过了一遍,还差一...

    用户1622570
  • 【NDN基础】

    Information-Centric Networking: A Natural Design for Social Network Applications

    魏晓蕾

扫码关注云+社区

领取腾讯云代金券