如何判断CPU字节序之[Big-endian vs Little-endian]

【本文链接】

http://www.cnblogs.com/hellogiser/p/big-endian-vs-little-endian.html

【Big-endian vs Little-endian】

  超过一个字节的数据在内存中会用几个字节存储,根据数据在内存的存放方式,分大端模式(Big-endian)和小端模式(Little-endian)。

  大端模式是将数据的高位存在内存的低位地址;小端模式而是将数据的高位存在内存的高位地址,以下是十六进制0x12345678在内存地址的两种存储方式(假设数据是按原码存储),0x12345678中,12是高位,78是低位。

        

对于Big-endian,其MSB(Most Significant Byte,最高有效字节)为0x12,其LSB (Least Significant Byte,最低有效字节)为0x78。

对于Little-endian,其MSB(Most Significant Byte,最高有效字节)为0x78,其LSB (Least Significant Byte,最低有效字节)为0x12。

从上面的例子可以看到,采用Big-endian方式存储数据是符合我们人类的思维习惯的。

谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。IBM, Motorola(Power PC), Sun的机器一般采用Big-endian方式存储数据。而x86系列则采用Little-endian方式存储数据。

【Why】

  为什么要注意字节序的问题?
  在单机环境里的程序不用考虑字节序(endian)的问题,因为字节序的不同是在不同单机环境里的,如果你要在不同单机之间传递数据,就要考虑字节序的问题,因为数据是按地址存取的,如果你是不同的字节序单机通信,就会导致传输数据”变异“,例如,把Little-endian环境的数据0x12345678的指针传递给Big-endian环境,数据就“变异”为0x78563412。
  所有网络协议也都是采用Big-endian的方式来传输数据的。所以有时我们也会把Big-endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。

【Code】

C++ Code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
/*
    version: 1.0
    author: hellogiser
    blog: http://www.cnblogs.com/hellogiser
    date: 2014/7/10
*/

/*
 big-endian: return 1
 little-endian: return 0
*/
int checkEndianByInt()
{
    int i = 0x12345678;
    char *c = (char *)&i;
    return(*c == 0x12);
}

/*
 big-endian: return 1
 little-endian: return 0
*/
int checkEndianByUnion()
{
    union
    {
        int a;// 4 bytes
        char b// 1 byte
    } u;

u.a = 1;
    if (u.b == 1) return 0;
    else return 1;
}

【参考】

http://www.cnblogs.com/fengfenggirl/archive/2013/03/31/2992451.html

http://www.cnblogs.com/berry/articles/1588084.html

http://www.cnblogs.com/TsuiLei/archive/2008/10/29/1322504.html

http://blog.csdn.net/wyzxg/article/details/5349896

【本文链接】

http://www.cnblogs.com/hellogiser/p/big-endian-vs-little-endian.html

如何判断CPU字节序之[Big-endian vs Little-endian]

时间: 2024-10-25 12:28:30

如何判断CPU字节序之[Big-endian vs Little-endian]的相关文章

[C++][转]CPU字节序 网络序 主机序 大端小端

原帖:http://www.cnblogs.com/darktime/p/3298075.html 不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序最常见的有两种1. Little endian:将低序字节存储在起始地址2. Big endian:将高序字节存储在起始地址 LE little-endian最符合人的思维的字节序地址低位存储值的低位地址高位存储值的高位怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说低位值小,就应该放在内存地址小的地方,也

编程判断大端字节序和小端字节序

代码一:联合体union的存放顺序是所有成员都从低地址开始存放,若处理器是Big_endian(从高字节到低字节存放数据)的,则返回0:若是Little_endian(从低字节到高字节存放数据)的,则返回1. int checkCPU() { union w { int a; char b; } c; c.a = 1; return (c.b == 1); } 代码二: #include <stdio.h> #include <stdlib.h> int main() { int

字节序转换以及判断字节序

在网络信息跨主机传输过程中,不同主机的字节序问题可能不同,因此必须进行字节序的转换. 本地字节序--> 网络字节序 -->本地字节序 字节序转换函数: htons和htonl是将本地字节序转换为网络字节序,htons是对16位整数进行转换,htonl是对32位正数进行转换,ntohs和ntohl恰好相反. 判断主机字节序和网络字节序: #include<arpa/inet.h> #include<stdio.h> //judge host endian void jud

网络字节序与主机字节序

最近在项目开发过程中,需要在采用JAVA作为语言的服务器与采用C++作为语言的服务器间进行通信,这就涉及到这两种语言间数据类型的转换以及网络字节序与主机字节序的区别.该文主要说说网络字节序和主机字节序的区别以及Little endian与Big endian的概念.其实编程的事就比较简单了   我也懒得写了,直接引用了我觉得写的挺好的两篇文章: 什么是Big Endian和Little Endian? 来源:http://blog.ednchina.com/qinyonglyz/194674/m

字节序监测

最近被人家问到关于字节序的问题,以前一般也没有怎么关心这方面的问题,不过怎么说这个也是一个基础的问题,今天就此就做个简单的记录: 程序之间的通信,其实就是发送数据流,字节(byte)被看作是数据的最小单位,一个字节中还包含8个比特(bit),这个是基础的计算机知识了,隐约中记得,这个在 我还没学习编程之前其实都已经明白这个东西了,貌似是高中有个数学课程里面提到过的,那时候记忆得比较清楚: 在一个32位的CPU中“字长”为32个bit,也就是4个byte.在这样的CPU中,总是以4字节对齐的方式来

网络字节序与主机字节序 高低位

最近在项目开发过程中,需要在采用JAVA作为语言的服务器与采用C++作为语言的服务器间进行通信,这就涉及到这两种语言间数据类型的转换以及网络字节序与主机字节序的区别.该文主要说说网络字节序和主机字节序的区别以及Little endian与Big endian的概念.其实编程的事就比较简单了   我也懒得写了,直接引用了我觉得写的挺好的两篇文章: 什么是Big Endian和Little Endian? 来源:http://blog.ednchina.com/qinyonglyz/194674/m

字节序详解

一.字节序定义 字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了). 其实大部分人在实际的开发中都很少会直接和字节序打交道.唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题. 在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和Little-Endian.引用标准的Big-Endian和Little-Endian的定义如下: a) Little-Endian就是低位字节排放在内存的低地址端,高位

c# 主机和网络字节序的转换 关于网络字节序和主机字节序的转换

最近使用C#进行网络开发,需要处理ISO8583报文,由于其中有些域是数值型的,于是在传输的时候涉及到了字节序的转换. 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有两种字节顺序,根据他们所处的位置我们分别称为主机节序和网络字节序. 通常我们认为网络字节序为标准顺序,封包的时候,将主机字节序转换为网络字节序,拆包的时候要将网络字节序转换为主机字节序. 原以为还要自己写函数,其实网络库已经提供了. 主机到网络:short/int/long IPAddress.HostToNet

主机字节序和网络字节序转换

为什么要转换? 主机字节序:整数在内存中保存的顺序,不同的处理器对应不容的模式 Little endian 将低序字节存储在起始地址 Big endian    将高序字节存储在起始地址 网络字节序:整数在网络中的发送顺序 网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型.操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释. 网络字节顺序采用big endian排序方式 htons 本地的无符号short型主机字节序转换为网络字节序 htonl