开发者社区> 徐胖子> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

大小端模式

简介: 1 什么大小端 大小端在计算机业界,Endian表示数据在存储器中的存放顺序。 小端模式:数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。 大端模式:数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。这种存储模式有点儿类似于把数
+关注继续查看

1 什么大小端

大小端在计算机业界,Endian表示数据在存储器中的存放顺序。


小端模式数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。


大端模式数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。这种存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放。


如整形十进制数字305419896 ,转化为十六进制表示 0x12345678 。其中每2个十六进制位占8个二进制位(1个十六进制位占4个二进制位)



2 为何有大小端模式之分

在操作系统中x86和一般OS(如windows、FreeBSD、Linux)使用小端模式。但如Mac OS是大端模式。

在计算机系统是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在Java中除了8bit的byte类型,还有16bit的short类型,32bit的int类型等(要看具体编译器)。另外对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个若将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。


应用场景

1 不同端模式的处理器进行数据传递时必须要考虑端模式的不同。
2 在网络上传输数据时,由于数据传输的两端对应不同的硬件平台,采用的存储字节顺序可能不一致。所以在TCP/IP协议规定了在网络上必须采用网络字节顺序,也就是大端模式。对于char型数据只占一个字节,无所谓大端和小端。而对于非char类型数据,必须在数据发送到网络上之前将其转换成大端模式。接收网络数据时按符合接受主机的环境接收。



3 Java中的大小端

存储量大于1字节,非char类型,如int,float等要考虑字节顺序问题了。Java由于虚拟机的关系,屏蔽了大小端问题,需要知道的话可用 ByteOrder.nativeOrder()查询。在操作ByteBuffer中,也可使用ByteBuffer.order()进行设置:
// ByteBuffer中字节存储次序
public class Endians {
    public static void main(String[] args) {
        // 创建12个字节的字节缓冲区
        ByteBuffer bb = ByteBuffer.wrap(new byte[12]);
        // 存入字符串
        bb.asCharBuffer().put("abdcef");
        System.out.println(Arrays.toString(bb.array()));
 
        // 反转缓冲区
        bb.rewind();
        // 设置字节存储次序
        bb.order(ByteOrder.BIG_ENDIAN);
        bb.asCharBuffer().put("abcdef");
        System.out.println(Arrays.toString(bb.array()));
 
        // 反转缓冲区
        bb.rewind();
        // 设置字节存储次序
        bb.order(ByteOrder.LITTLE_ENDIAN);
        bb.asCharBuffer().put("abcdef");
        System.out.println(Arrays.toString(bb.array()));
    }
}
[0, 97, 0, 98, 0, 100, 0, 99, 0, 101, 0, 102]
[0, 97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102]
[97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102, 0]
前两句打印说明了,ByteBuffer存储字节次序默认为大端模式。最后一段设置了字节存储次序再输出,可看出存储次序为小端模式。


原贴地址:http://www.cnblogs.com/Leo_wl/p/4881204.html


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Clang代码覆盖率检测(插桩技术)
Clang的全称是C Language Family Frontend for LLVM,即基于LLVM的C系列语言的前端编译器。iOS应用的前端编译,即是采用Clang完成的。本篇文章,我们主要介绍Clang内置的一个简单的代码覆盖率检测功能,对于iOS开发来说,此功能更多用于Objective-C的方法插桩,为二进制重排提供支持,优化应用启动速度。但代码覆盖率检测功能并不仅仅只能应用与二进制重排,其本质是对于函数级、基本块级或代码边缘级插入回调,我们可以基于这一原理更灵活的实现所需要的功能。
0 0
C语言——测试电脑大小端
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中; 小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中。
0 0
设置socket接收和发送超时的一种方式
设置socket接收和发送超时的一种方式
0 0
【OpenGL】十六、OpenGL 绘制四边形 ( 绘制 GL_QUADS 四边形 )
【OpenGL】十六、OpenGL 绘制四边形 ( 绘制 GL_QUADS 四边形 )
0 0
Kali防火墙ufw安装与命令
Kali防火墙ufw安装与命令
0 0
IDL编译器实现入门
IDL编译器实现入门.pdf 目录 目录 1 1. 前言 1 2. 目标(example.idl) 1 3. 功能 2 4. 文件构成 2 5. flex词法文件(mooon.
1041 0
linux同步windows的时间
找了很多的资料,都没有windows做时间服务,linux同步windows的时间的,最后自己找了一些软件,终于搞定了,写出来给大家共享,以免大家多走弯路   首先在http://www.meinberg.
2378 0
架构设计文档提纲简描
提纲很简单的:一、概述二、目的三、项目背景四、系统建设目标五、参考资料六、架构设计6.1 架构分析6.2 设计思想6.3 架构体系6.
646 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载