资讯专栏INFORMATION COLUMN

理解字节序

henry14 / 2013人阅读

摘要:什么是字节序字节序,顾名思义就是字节的顺序。因此,单字节的数据如或的类型的数据没有字节序这一说,因为获取它只需要读取一个字节。主机序机器的字节序,有大端模式也有小端模式,根据具体机器的处理决定的,小端模式较常见。

1、什么是字节序

字节序,顾名思义就是字节的顺序。更具体的讲,它是多字节数据存储和传输时,字节的顺序。

2、为什么有“字节序”这个东西?

因为物理内存是以字节为单位进行数据存储,也就是我们常说的计算机基本单位为字节。
因此,单字节的数据(如c或java的char类型的数据)没有字节序这一说,因为获取它只需要读取一个字节。而多字节数据,由于有多个字节,所以在存储和传输可以使用不同的顺序进行操作。

3、举个例子

十六进制数 0x12345678 共占4个字节,分别是0x12、0x34、0x56、0x78,因此在该数字中0x12属于高位数据,0x78属于地位数据。

注:
可以把内存看成是一个很大的数组,4G内存则是一个长度为4294967296的数组。
该数组的索引其实就是内存地址,左边是比较小的地址,右边则越来越大,直至最大值。

第一种顺序:低地址存放高位数据,叫大端模式

第二种顺序:低地址存放低位数据,叫小端模式

两者,大端模式比较符合人类的阅读习惯;小端模式更符合计算机的处理方式,因为计算机从低位开始处理。

4、大小端的应用场景。

网络序:也称为网络字节序,都是大端模式。因为TCP/IP协议对各层协议统一规定采用大端模式。

主机序:机器的字节序,有大端模式也有小端模式,根据具体机器的处理决定的,小端模式较常见。

那么,在进行网络通讯时,在将本地数据发送到网络上就需要注意这个顺序。如果本地机器的字节序是小端模式,则需要先转换成大端模式后再进行发送;如果本地已经是大端模式,则可以直接发送。

ps.在私有协议上的数据,只要收发两端约定好,用什么顺序都行。不过,还是建议用网络序发送。

5、如何判断主机序
int main() {
    int x = 0x1020304;
    char* p = (char*)&x;
    if(p[0]==1){
         printf("Big
");
    }
    else{
          printf("Little
");
    }
    return 0;
}
6、Java设置大小端
public class HelloEndian {

    public static void main(String[] args) {
        ByteBuffer b = ByteBuffer.wrap(new byte[4]);
        b.order(ByteOrder.BIG_ENDIAN);
        b.putInt(0x01020304);
        System.out.println("Big-Endian:    " + Arrays.toString(b.array()));

        b = ByteBuffer.wrap(new byte[4]);
        b.order(ByteOrder.LITTLE_ENDIAN);
        b.putInt(0x01020304);
        System.out.println("Little-Endian: " + Arrays.toString(b.array()));
    }

}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71540.html

相关文章

  • PHP中pack、unpack的详细用法

    摘要:中有两个函数和,很多在实际项目中从来没有使用过,甚至也不知道这两个方法是用来干嘛的。比如和分别对应的二进制表示为。主机字节序表示当年机器的字节序也就是网络字节序是确定的,而主机字节序是依机器确定的,一般为小端字节序。 PHP中有两个函数pack和unpack,很多PHPer在实际项目中从来没有使用过,甚至也不知道这两个方法是用来干嘛的。这篇文章来为大家介绍一下它俩到底是用来干啥的。 p...

    beita 评论0 收藏0
  • Node闲谈之Buffer

    摘要:闲谈系列不涉及具体的讲解,只会勾勾画画一些自己认为比较重要的特性。我们一般认为用两个字节位表示,并且完全囊括了字符集。将其转换成进制就是只是表示它们是码。三的读取和写入相关重要的只有能够读写,才能够显示其存在的价值。 原文地址:http://www.cnblogs.com/DeanCh... 在刚接触Nodejs的时候,有些概念总让学前端的我感到困惑(虽然大学的时候也是在搞后端,世界上...

    Godtoy 评论0 收藏0
  • WebSocket系列之JavaScript中数字数据如何转换为二进制数据

    摘要:以和为例,说明中的数字数据如何转换为二进制数据。对象用来表示通用的固定长度的原始二进制数据缓冲区。中的数字数据如何转换为二进制数据对和有了一个大概的了解,下面让我们来看下它是如何进行二进制数据操作的。 概述 本文主要通过对JavaScript中数字数据与二进制数据之间的转换,让读者能够了解在JavaScript中如何对数字类型(包括但不限于Number类型)进行处理。 二进制数据在日常...

    MASAILA 评论0 收藏0
  • 【数据类型存储原理】数据的存储 - 深度剖析数据在内存中的存储

    摘要:数据的存储前言数据类型汇总整型家族浮点型家族自定义类型指针类型。整型家族注在之后的标准规定,将类型数据划分为整型家族,因为字符在内存中会将其转化为码值进行存储。 ...

    yuanzhanghu 评论0 收藏0
  • PHP中的pack和unpack函数

    摘要:鉴于文件读写网络编程,或者说字节流处理的重要性,掌握这两个函数是迈向高级编程的基础。相比之下字节处理门庭冷落,相关函数寥寥无几。上述是函数简单的使用场景,接下来分别介绍和函数。如其名,函数的工作是将数据按照格式打包成字节数组。 转载请注明文章出处:https://tlanyan.me/php-pack-a... PHP有两个重要的冷门函数:pack和unpack。在网络编程,读写图像...

    Lin_R 评论0 收藏0

发表评论

0条评论

henry14

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<