大小端模式

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

时间: 2024-09-05 14:38:59

大小端模式的相关文章

大小端模式对C语言的共用体结构有何影响

1.一些问题 问题1 #include "stdio.h" union { int i; char ch[2]; }key; main() { key.i=65*256+66; printf("%c\t%c\n",key.ch[0],key.ch[1]); } 答案是B      A:为什么不是A      B呢? 在前面的文章中我们已经测试过,X86体系结构的CPU是小端模式的.比如一个数0x1234,放在内存里按照内存地址从低往高实际上是低地址字节里放的是0x3

深入浅出: 大小端模式

Writer      :李强强 一.什么是大小端? 大小端在计算机业界,Endian表示数据在存储器中的存放顺序.百度百科如下叙述之: 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放: 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方

htonl(),htons(),ntohl(),ntons()--大小端模式转换函数

原文:http://qiuye.iteye.com/blog/844764 不同机器内部对变量的字节存储顺序不同,有的采用大端模式(big-endian),有的采用小端模式(little-endian).大端模式是指高字节数据存放在低地址处,低字节数据放在高地址处.小端模式是指低字节数据存放在低地址处,高字节数据放在高地址处. 在网络上传输数据时,由于数据传输的两端可能对应不同的硬件平台,采用的存储字节顺序也可能不一致,因此 TCP/IP 协议规定了在网络上必须采用网络字节顺序(也就是大端模式)

用指针检测大小端模式

#include <stdio.h> #include <stdlib.h> //用指针的方式检测机器的大小端模式 int small_port() { int a = 1 ; char b = *((char *)(&a)) ; return b ; } int main(void) { int i = small_port(); if(1 == i) printf("小端模式\n"); else printf("大端模式\n");

用C语言程序判断大小端模式_C 语言

1.大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中:小端模式相反  2.为什么有大小端之分???  因为在计算机系统中,存储是以字节为单位的,每个地址单元都对应着一个字节,一个字节=8bit.在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器).对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,如何安排多个字节的存储,这就有了大端存储模式和小端存储模式 3.各自的优势:

系统的存储模式---大小端模式

#include <stdio.h> bool issmall(); int main() { if (issmall()) { printf("Little \n"); } else { printf("Big\n"); } 262 657的二进制是 0000 0000 0000 0100 0000 0010 0000 0001 如果是Intel PC(Little-endian),这个数字将存储为 字节地址:00           01      

深入理解计算机系统-之-数值存储(一)-CPU大端和小端模式详解

大端与小端 在嵌入式开发中,大端(Big-endian)和小端(Little-endian)是一个很重要的概念. MSB与LSB 最高有效位(MSB)指二进制中最高值的比特.在16比特的数字音频中,其第1个比特便对16bit的字的数值有最大的影响.例如,在十进制的15,389这一数字中,相当于万数那1行(1)的数字便对数值的影响最大.比较与之相反的"最低有效位"(LSB). LSB(Least Significant Bit),意为最低有效位:MSB(Most Significant

处理器的大端和小端模式

 大端格式: 在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中.   小端格式: 与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节.    请写一个C函数,若处理器是Big_endian的,则返回0:若是Little_endian的,则返回1 解答: int checkCPU( ) {     {            union w            {                     int  a;  

关于大小端、位域的一些概念详解_C 语言

大小端: 对于像C++中的char这样的数据类型,它本身就是占用一个字节的大小,不会产生什么问题.但是当数制类型为int,在32bit的系统中,它需要占用4个字节(32bit),这个时候就会产生这4个字节在寄存器中的存放顺序的问题.比如int maxHeight = 0x12345678,&maxHeight = 0x0042ffc4.具体的该怎么存放呢?这个时候就需要理解计算机的大小端的原理了. 大端:(Big-Endian)就是把数值的高位字节放在内存的低位地址上,把数值的地位字节放在内存的