大端BigEndian、小端LittleEndian与字符集编码

BigEndian(大端):低字节在高内存地址

LittleEndian(小端):低字节在低内存地址

也就是看低字节在高内存地址还是低内存地址,也就是看低字节在前还是高字节在前,低字节在前自然是小端,高字节在前就是大端。

所谓大小端,是指字节存储或传输时的顺序。

注:最小寻址单位是指特定的计算机硬件机构所支持的最小数据访问块大小。以
个人电脑为例,内存机构的最小寻址单位为1个字节(1 Byte)即8个bit。也就
是说,你无法单独访问1 bit的信息或者任意小于1字节的信息。个人电脑中的硬
盘部分最小访问单位为4KB(依厂商不同而有所区别,较早的硬盘该单位比较
小),这就是通常所讲的“硬盘按块寻址”,一块既指4KB的数据。

例如:

大小端字节序与字符集编码之间的联系就是BOM,即 Byte Order Mark,字节顺序标记。例如可以以utf16编码将数据存储到文件中,在文件头部,会存入BOM,以表示在读取数据的时候是按照大端读取还是小端读取。FEFF表示大端,FFFE表示小端。而utf-8由于其特殊的变长编码规则,导致它是可以自解释的,所以以utf-8编码存储、传输数据时可以选择不加入BOM,同时这也是推荐的方式。

因为utf-8代码单元为1字节,每个字节高位都有标识,每当读到一个字节时,可以根据其高位进行判断。如上图,如果读到0开头的字节,则此字节单独编码;如果读到110、1110、11110开头的字节,则接着读取对应个数的字节;如果读到10开头的字节,则继续读取,读到110、1110、11110开头的字节为止。

由此看来,无需BOM并且可以无视字节序。只是utf-8解码程序稍稍麻烦一些。

而utf-16编码方式的代码单元为2字节,则一个代码单元内的两个字节的先后顺序对读取会产生影响,必须指定字节序,否则只能靠猜。 
参考:

http://blog.csdn.net/joenqc/article/details/54891731 
http://www.cnblogs.com/skywang12345/p/3360348.html 
http://www.360doc.com/content/15/0915/14/26654031_499295872.shtml

在网络传输中,tcp协议采用大端字节序,也就是先接收到的字节为数据的高位。在不同的操作系统平台中,内存采用的字节序可能不同,x86和一般的OS(如windows,FreeBSD,Linux)使用的是小端模式。但比如Mac OS是大端模式。在不同平台之间进行网络传输时,需要进行特殊的转换,详见

http://www.cnblogs.com/fuchongjundream/p/3914770.html

在java中,通过 ByteOrder.nativeOrder() 方法可以判断当前平台采用的时大端字节序还是小端字节序。

public static ByteOrder nativeOrder() {
    return Bits.byteOrder();
}
static ByteOrder byteOrder() {
    if (byteOrder == null)
        throw new Error("Unknown byte order");
    return byteOrder;
}

static {
    long a = unsafe.allocateMemory(8);
    try {
        unsafe.putLong(a, 0x0102030405060708L);
        byte b = unsafe.getByte(a);
        switch (b) {
        case 0x01: byteOrder = ByteOrder.BIG_ENDIAN;     break;
        case 0x08: byteOrder = ByteOrder.LITTLE_ENDIAN;  break;
        default:
            assert false;
            byteOrder = null;
        }
    } finally {
        unsafe.freeMemory(a);
    }
}

主要实现为static静态方法,首先为long分配了8个字节内存,然后为long分配了值,之后拿出long的第一个字节,如果为数据的高位,那么平台采用的是大端字节序,如果为数据的低位,那么平台采用的时小端字节序。

原文地址:https://www.cnblogs.com/williamjie/p/9377018.html

时间: 2024-11-24 18:07:58

大端BigEndian、小端LittleEndian与字符集编码的相关文章

网络字节码、本地字节码(大端,小端)

大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的<格利佛游记>:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战.战争的原因:大家都知道,吃鸡蛋的时候,原始 的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须 先打破鸡蛋较小的一端,违令者重罚.然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了

我如何确定一个机器的字节顺序是大端还是小端?

通常的技巧是使用一个指针: int x = 1; if(*(char *)&x == 1) printf("little-endian\n"); else printf("big-endian\n"); 或者一个union: union { int i; char c[sizeof(int)]; } x; x.i = 1; if(x.c[0] == 1) printf("little-endian\n"); else printf(&qu

大端和小端(big endian little endian)

一.大端和小端的问题 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian 则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放据的低位字节到高位字节). 例如,假设从内存地址 0x0000 开始有以下数据:  0x0000         0x0001       0x0002       0x0003  0x12            0x34          

大端和小端(Big endian and Little endian)

一.大端和小端的问题 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian 则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放据的低位字节到高位字节). 例如,假设从内存地址 0x0000 开始有以下数据:  0x0000         0x0001       0x0002       0x0003  0x12            0x34          

【转】轻松记住大端小端的含义(附对大端和小端的解释)

原文网址:http://www.cnblogs.com/wuyuegb2312/archive/2013/06/08/3126510.html 或许你曾经仔细了解过什么是大端小端,也动手编写了测试手头上的机器上是大端还是小端的程序,甚至还编写了大端小端转换程序:但过了一段时间之后,当你再看到大端和小端这两个字眼,你的脑中很快浮起了自己曾经做过的工作,却总是想不起究竟哪种是大端.哪种是小端,然后又去查以前写的记录?更让人不快的是,这种经历反反复复,让你十分困扰.如果你和以前的笔者一样,有过这种不快

【转】如何判断CPU是大端还是小端模式

原文网址:http://blog.csdn.net/ysdaniel/article/details/6617458 如何判断CPU是大端还是小端模式 http://blog.sina.com.cn/s/blog_66a61f310100i7m0.html MSB:Most Significant Bit  ------- 最高有效位    LSB:Least Significant Bit ------- 最低有效位 大端模式(big-edian) big-endian:MSB存放在最低端的地

网络通信之 字节序转换原理与网络字节序、大端和小端模式

原文地址:http://www.cnblogs.com/fuchongjundream/p/3914770.html 一.在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节.小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低

大端与小端

大端:数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中: 小端:数据的低位保存在内存的低地址中,而数据的搞完保存在内寸的高地址中: 大小端助记图: 测试本机是大端还是小端的代码: #include <stdio.h> int main() { union { short s; char c[sizeof(short)]; }un; un.s = 0x0102; if(sizeof(short) == 2) { if(un.c[0] == 1 && un.c[1]

字节存储排序:大端和小端的判别及转换

当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-endian)和小端(little- endian)两个描述. 字节排序按分为大端和小端,概念如下 大端(big endian):低地址存放高有效字节 小端(little endian):低字节存放地有效字节 现在主流的CPU,intel系列的是采用的little endian的格式存放数据,而moto