BE--LE

来源:互联网 发布:二次元影像软件用法 编辑:程序博客网 时间:2024/05/01 11:06

一、检查BE---LE

 #include <iostream>
using namespace std;
int CheckCPU();//若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
int main(){

   int a=CheckCPU();
   if (a)
   {
    cout<<"Little_endian"<<endl;
   }
   else
    cout<<"Big_endian"<<endl;
 return 0;
}
int CheckCPU(){
 //联合体union的存放顺序是所有成员都从低地址开始存放
 //Union的大小为其内部所有变量的最大值,并且按照类型最大值的整数倍进行内存对齐。
 union w{
  int a;
  char b;
 }c;
 c.a=1;
 return (c.b==1);
}

 二、不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序 .
最常见的有两种
1.LE little-endian 符合人的思维的字节序
地址低位存储值的低位,地址高位存储值的高位 .

2.BE big-endian 直观的字节序
地址低位存储值的高位,地址高位存储值的低位 .
例:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
              big-endian  little-endian
0x0000  0x12           0xcd
0x0001  0x23           0xab
0x0002  0xab           0x34
0x0003  0xcd           0x12
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。它采用了big endian排序方式。

为了进行转换socket提供了转换的函数 有下面四个
htons 把unsigned short类型从主机序转换到网络序(s 就是short, l是long ,h是host, n是network)
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序

在使用little endian的系统中 这些函数会把字节序进行转换 。在使用big endian类型的系统中 这些函数会定义成空宏

不同的CPU上运行不同的操作系统,字节序也是不同的。在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 。

x86系统是小端字节序系统、PPC系统是大端字节序系统