Felix_herro于 2019-12-08 10:13:05 发布 137 分类专栏: 基础知识 大端(Big Endian)/小端(Little Endian)字节序 参考文章: 阮一峰的网络日志:理解字节序(图片取自这里) Wikipedia:Endianness How to teach endian 大端字节序 与 小端字节序 在计算机中存在这样一个问题:如何表示各种各样的数据? 对于图片等文件来说,有固定的格式文档参考。 而对于整数来说,计算机应该如何表示? 它的定义一定包括整数的大小、是否带符号以及符号是什么、使用什么编码格式表示(一般都是二进制补码),还有很重要的一点:字节顺序。 字节应该从右向左读还是从左向右读呢? 这种读取的顺序就称为:字节序(Byte-order / Endianness) 字节序分为两种:大端字节序(Big Endian,从左向右)和小端字节序(Big Endian,从右向左) 换句话说 大端字节序高位字节在前,低位字节在后 小端字节序低位字节在前,高位字节在后 从一个十六进制数字0x1234开始: 大端字节序 大端字节序是人类处理自然语言的做法,符合人类从左向右读的阅读习惯。 在这种规范下,十六进制数会先存储0x12作为高字节,接下来存储0x34。 小端字节序 低位字节在前,高位字节在后,也就是会以0x3412的形式存储。 注意! 字节序是以字节为单位定义的,在一个字节中,两个半字节仍然是以大端的形式存在。 疑问? 为什么要区分字节序?这样复杂的意义是什么? image image 小端字节序的意义 小端字节序对于逻辑电路更有效率。逻辑电路先处理低位字节更有效率,因为计算都是从低位开始的,计算机中的内部处理逻辑都是使用小端字节序。 但是,大多数的网络协议和文件格式都是大端字节序,这样对用户更加友好。 既然有区分,在使用时肯定要使用一定的解析规则,下面进行简要介绍。 字节序的处理 对于大端字节序,计算机先读到的是高位字节,后读到的是低位字节。而小端字节序恰好相反。 字节序的处理:只有在读取的时候才需要区分字节序,其他情况都不需要处理。 处理器读取外部数据时,必须知道数据的字节序才可以将其转化成正确的值。接下来就可以正常使用这个值,不需要再考虑字节序。而向外部设备写数据的时候,也不需要考虑字节序,正常写入一个值即可,外部设备会自己处理字节序的问题。 例如,处理器读入一个16位整数 大端字节序会按照如下方法转值: x = buf[offset] * 256 + buf[offset+1]; 1 其中buf是整个数据块在内存中的起始地址,offset表示偏移量,也就是正在读取的位置。第一个字节乘以256,再加上第二个字节,就是大端字节序的值,这个式子可以用逻辑运算符改写。即: x = buf[offset]<<8 | buf[offset+1]; 1 编译器总是将乘2的幂转换成移位指令,这样更加方便!左移八位,即在后面添加8个0。 小端字节序会按照如下方法转值: x = buf[offset+1] * 256 + buf[offset]; 1 32位整数的求值公式也是一样的 /* 大端字节序 */ i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24); /* 小端字节序 */ i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24); ———————————————— 版权声明:本文为CSDN博主「Felix_herro」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/a1219532602/article/details/103442437 |
|