专栏首页网管叨bi叨什么是大端序和小端序,为什么要有字节序

什么是大端序和小端序,为什么要有字节序

什么是字节序

字节序,又称端序尾序(英语中用单词:Endianness 表示),在计算机领域中,指电脑内存中或在数字通信链路中,占用多个字节的数据的字节排列顺序。

在几乎所有的平台上,多字节对象都被存储为连续的字节序列。例如在 Go 语言中,一个类型为int的变量x地址为0x100,那么其指针&x的值为0x100。且x的四个字节将被存储在内存的0x100, 0x101, 0x102, 0x103位置。

字节的排列方式有两个通用规则:

  • 大端序(Big-Endian)将数据的低位字节存放在内存的高位地址,高位字节存放在低位地址。这种排列方式与数据用字节表示时的书写顺序一致,符合人类的阅读习惯。
  • 小端序(Little-Endian),将一个多位数的低位放在较小的地址处,高位放在较大的地址处,则称小端序。小端序与人类的阅读习惯相反,但更符合计算机读取内存的方式,因为CPU读取内存中的数据时,是从低地址向高地址方向进行读取的。

上面的文字描述有点抽象,我们拿一个例子来解释一下字节排列时的大端序和小端序。

在内存中存放整型数值168496141 需要4个字节,这个数值的对应的16进制表示是0X0A0B0C0D,这个数值在用大端序和小端序排列时的在内存中的示意图如下:

大端序和小端序

为何要有字节序

很多人会问,为什么会有字节序,统一用大端序不行吗?答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。在计算机内部,小端序被广泛应用于现代 CPU 内部存储数据;而在其他场景,比如网络传输和文件存储则使用大端序

Go语言对字节序的处理

Go 语言存储数据时的字节序依赖所在平台的 CPU,处理大小端序的代码位于 encoding/binary ,包中的全局变量BigEndian用于操作大端序数据,LittleEndian用于操作小端序数据,这两个变量所对应的数据类型都实现了ByteOrder接口。

package main

import (
 "encoding/binary"
 "fmt"
 "unsafe"
)

const INT_SIZE = int(unsafe.Sizeof(0)) //64位操作系统,8 bytes

//判断我们系统中的字节序类型
func systemEdian() {

 var i = 0x01020304
 fmt.Println("&i:",&i)
 bs := (*[INT_SIZE]byte)(unsafe.Pointer(&i))

 if bs[0] == 0x04 {
  fmt.Println("system edian is little endian")
 } else {
  fmt.Println("system edian is big endian")
 }
 fmt.Printf("temp: 0x%x,%v\n",bs[0],&bs[0])
 fmt.Printf("temp: 0x%x,%v\n",bs[1],&bs[1])
 fmt.Printf("temp: 0x%x,%v\n",bs[2],&bs[2])
 fmt.Printf("temp: 0x%x,%v\n",bs[3],&bs[3])

}


func testBigEndian() {

 var testInt int32 = 0x01020304
 fmt.Printf("%d use big endian: \n", testInt)
 testBytes := make([]byte, 4)
 binary.BigEndian.PutUint32(testBytes, uint32(testInt))
 fmt.Println("int32 to bytes:", testBytes)
 fmt.Printf("int32 to bytes: %x \n", testBytes)

 convInt := binary.BigEndian.Uint32(testBytes)
 fmt.Printf("bytes to int32: %d\n\n", convInt)
}

func testLittleEndian() {

 var testInt int32 = 0x01020304
 fmt.Printf("%x use little endian: \n", testInt)
  testBytes := make([]byte, 4)
 binary.LittleEndian.PutUint32(testBytes, uint32(testInt))
 fmt.Printf("int32 to bytes: %x \n", testBytes)

 convInt := binary.LittleEndian.Uint32(testBytes)
 fmt.Printf("bytes to int32: %d\n\n", convInt)
}

func main() {
 systemEdian()
 fmt.Println("")
 testBigEndian()
 testLittleEndian()
}

运行上面的程序会在终端里输出

&i: 0xc000084000
system edian is little endian
temp: 0x4,0xc000084000
temp: 0x3,0xc000084001
temp: 0x2,0xc000084002
temp: 0x1,0xc000084003

16909060 use big endian: 
int32 to bytes: [1 2 3 4]
int32 to bytes: 01020304 
bytes to int32: 16909060

1020304 use little endian: 
int32 to bytes: 04030201 
bytes to int32: 16909060

总结

计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合比如网络传输和文件储存,几乎都是用的大端字节序。正是因为这些原因才有了字节序。

计算机处理字节序的时候,如果是大端字节序,先读到的就是高位字节,后读到的就是低位字节。小端字节序则正好相反。

文章分享自微信公众号:
网管叨bi叨

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

如有侵权,请联系 yunjia_community@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 小程序是什么?有什么用?

    据统计,微信现今注册用户已达9.8亿,可以说在中国微信就是移动互联网,移动互联网就是微信,一点也不夸张。1月9号微信上线小程序后,微信再次抓住公众视野,小程序的...

    企鹅号小编
  • 为什么小程序将成为风口?为什么要做小程序?

    为什么小程序将成为风口? 因为你的竞争对手都在做小程序! 为什么要做微信小程序? 因为你的目标客户都在使用微信! 在当今,国民级别的聊天应用非微信莫属。在现今,...

    企鹅号小编
  • 什么是小程序?微信小程序有什么好处……

    小程序就是一种不需要安装的APP,用户只要扫一扫或者搜一搜就可以打开…… ? 打开小程序的方法:线下二维码海报或者小程序商店扫码。 小程序的和原生APP的区别?...

    企鹅号小编
  • 什么是小程序?微信小程序为什么这么火热?

    根据小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用。也体现了“用完即走”的理念,用户不用关心是否安装...

    企鹅号小编
  • 为什么1024是程序员节?

    2¹⁰=1024,这个程序员最熟悉的“整数”让10月24日的这一天成为技术人的专属节日——程序员节。一年一度的程序员节已经到来,在这里,腾讯多媒体实验室祝每一位...

    腾讯多媒体实验室
  • Linux基础(字节序是什么鬼)

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

    用户2617681
  • 为什么 Python3.6 之后字典是有序的

    字典的本质就是 hash 表,hash 表就是通过 key 找到其 value ,平均情况下你只需要花费 O(1) 的时间复杂度即可以完成对一个元素的查找,字典...

    somenzz
  • 为什么那么多人要做小程序?

    前言:自从2017年1月9号发布小程序以来,不少公司和个人已经投入到小程序的开发中。目前小程序入口较弱,只能依附于微信体系,那么大家都是出于什么原因要做小程序呢...

    连胜
  • 1024程序员节是怎么来的?为什么设置程序员节?

    1024是2的十次方,二进制计数的基本计量单位之一,因此每年的10月24日被大家亲切称为程序员节,也是一个属于中国程序员的共同节日。那么1024程序员节的来历是...

    哲洛不闹
  • [C#]大小端字节序(Big Endian和Little Endian)

    原文链接:http://blog.csdn.net/humanking7/article/details/51155778

    祥知道
  • 小程序开发|我有实体店,为什么还要做小程序?

    如果要让我来回答这个问题,那么我的答案会是:因为你的客户在用微信啊!但很多老板,似乎认为这个理由还不够充足,那好,我今天就跟大家详细的聊一下。

    用户1745481
  • 什么是BOM头(字节顺序标记(ByteOrderMark))

    在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码,现在已经有很多软件识别bom头,但是还有些不能识别bom头,比如PHP就...

    狼啸风云
  • 为什么服务端程序都需要先 listen 一下?

    大家好,我是飞哥。飞哥在北京摇号 9 年多,最近终于算是搞下来个北京的电动车牌,其中的艰难过程写个一万字估计都写不完。不管咋说,新能源也是车,总算是有车能开了。...

    开发内功修炼
  • 不要再问我,什么是小程序了……

    知晓君
  • 为什么我不想成为Web前端程序员

    Java学习123
  • 为什么我不想成为Web前端程序员

    为什么我不想成为Web前端程序员 职位名称并不代表技能集 作为一个前端开发人员,你是不是认为自己不需要懂很多技能?然而事实可能并非如此。 我在一个热门的工...

    用户1289394
  • 前端程序员为什么应该拿高薪

    决定产品价格最重要的是供求关系。技术水平重要,但绝没有市场供给关系重要。不能理解的话举个简单例子,空气重要么?重要,人没了空气活不了,但是为什么不值钱?就是因为...

    哲洛不闹
  • 为什么有了 MySQL ,还要有时序数据库?

    近日,UCloud新发布了一款时间序列数据库UTSDB (UCloud TimeSeries Database) ,此次上线的UTSDB-InfluxDB版基于...

    芋道源码

扫码关注云+社区

领取腾讯云代金券