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

3410人阅读 评论(0)

1.大端和小端的方式及判断

0x12345678   16进制，两个数就是一字节

低地址位     高低址位

4000&4001&4002&4003
LE 04 03 02 01
BE 01 02 03 04

big-endian   little-endian
0x0000 0x12                 0xcd
0x0001 0x34                 0xab
0x0002 0xab                 0x34
0x0003 0xcd                 0x12
x86系列CPU都是little-endian的字节序.

#include <iostream>

using namespace std;

typedef unsigned int UINT;
typedef unsigned char UCHAR;

int main()
{
UINT i=0x12345678;
cout<<hex<<i<<endl;
UCHAR *p = (UCHAR*)&i;          //将i的地址传给数组指针p，实际上p指向的地址是i在内存中存储的第一个字节，大端就是0x12，小端就是0x78
if((*p==0x78)&(*(p+1)==0x56))
cout<<"小端"<<endl;
else if((*p==0x12)&(*(p+1)==0x34))
cout<<"大端"<<endl;
else
cout<<"这是神马字节顺序呢？";
return 0;
}

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
union {
short s;
char c[sizeof(short)];
} un;
un.s = 0x0102;
if(sizeof(short)==2) {
if(un.c[0]==1 && un.c[1] == 2)
printf("big-endian\n");
else if (un.c[0] == 2 && un.c[1] == 1)
printf("little-endian\n");
else
printf("unknown\n");
} else
printf("sizeof(short)= %d\n",sizeof(short));
exit(0);
}

2.大端和小端的字节转换

#include <iostream>

using namespace std;

typedef unsigned int UINT;
typedef unsigned char UCHAR;

int main()
{
UINT i=0x12345678;
cout<<hex<<i<<endl;
UCHAR *p = (UCHAR*)&i;
UINT num,num1,num2,num3,num4;
num1=(UINT)(*p)<<24;
num2=((UINT)*(p+1))<<16;
num3=((UINT)*(p+2))<<8;
num4=((UINT)*(p+3));
num=num1+num2+num3+num4;

cout<<"num1:"<<hex<<num1<<endl;     //看num1的16进制表示，下同
cout<<"num2:"<<hex<<num2<<endl;
cout<<"num3:"<<hex<<num3<<endl;
cout<<"num4:"<<hex<<num4<<endl;
cout<<"num:"<<hex<<num<<endl;

unsigned char *q = (unsigned char*)&num;
if((*q==0x78)&(*(q+1)==0x56))
cout<<"小端"<<endl;
else if((*q==0x12)&(*(q+1)==0x34))
cout<<"大端"<<endl;
else
cout<<"这是神马字节顺序呢？";
return 0;
}

UINT EndianConvertLToB(UINT InputNum) {
UCHAR *p = (UCHAR*)&InputNum;
return(((UINT)*p<<24)+((UINT)*(p+1)<<16)+
((UINT)*(p+2)<<8)+(UINT)*(p+3));
}

UINT EndianConvertBToL(UINT InputNum) {
UCHAR *p = (UCHAR*)&InputNum;
return(((UINT)*p)+((UINT)*(p+1)<<8)+
((UINT)*(p+2)<<16)+(UINT)*(p+3)<<24);
}

个人资料
等级：
访问量： 29万+
积分： 4871
排名： 7099
博主微信公众号
不忘初心的行者
博客专栏
 Linux网络编程 文章：16篇 阅读：32884 Linux c/c++常用源代码 文章：3篇 阅读：3654 苹果移动IOS开发 文章：0篇 阅读：0