字节顺序

1,什么是字节顺序

指的就是数据在内存里存储的顺序,通常我们默认一个存储单元为1Byte,一个逻辑数据比如Float是4个Byte,它在内存理存储的顺序可以是高位在前,也可以是低位在前.这样就有区分了.

2,有些什么顺序:

Big-Endian(MSB),高位在低地址

Little-Endian(LSB),低位在低地址

Endian指的是当物理上的最小单元比逻辑上的最小单元小时,逻辑到物理的单元排布关系

3,为什么要有字节顺序?

因为程序需要与外界通讯,传送数据,这里的外界包括其他机器和其他语言写的程序.比如x86下c++程序与linux底下的程序通讯,比如c++和java的程序通讯.都会涉及到字节存放顺序的问题.

3,哪些会是Big-Endian,哪些会是Little-Endian

网络协议都是Big-Endian的,Java编译的都是Big-Endian的

Motorola的PowerPC是Big-Endian的

x86系列则采用Little-Endian方式存储数据。

ARM同时支持 big和little,实际应用中通常使用Little-Endian

4,如何判断我现在的系统里采用什么字节存储顺序?

 

/*用于判断存储格式是little endian还是big ednian的C代码*/
#include 
"stdafx.h" 

using namespace std;

union
{
long   Long;
char   Char[sizeof(long)];
} u;

void   main()
{
   u.Long
=1;
   
if(u.Char[0]==1)
   {
    printf(
"Little Endian!"n");

   }
   
else if(u.Char[sizeof(long)-1]==1)
   {
    printf(
"Big Endian!"n");
   }
   
else
   {
    printf(
"Unknown Addressing!"n");
   }

   printf(
"Now,Let's look at every byte in the memory!"n");
  
   
for(int i=0;i<sizeof(long);++i)
   {
    printf(
"[%x]=%x"n",&u.Char[i],u.Char[i]);
   }

   getchar();
   
return;
}

 

5,如何转换字节顺序,Big-Endian-->Little-Endian or Little Endian->Big Endian.

 

#include <stdio.h> 
const unsigned char SIZE_OF_UNSIGNEDINT = sizeof(unsigned int);
const unsigned char SIZE_OF_UNSIGNEDCHAR = sizeof(unsigned char);

void put_32(unsigned char * cmd, unsigned int data)
{
    
int i;
    
for (i = SIZE_OF_UNSIGNEDINT - 1 ; i >= 0 ; --i)
    {
     cmd[i] 
= data % 256 ;
      
// 或者可以:
      
// cmd[i] = data & 0xFF; 
     data = data >> 8 ;
    } 


unsigned 
int get_32(unsigned char * cmd)
{
    unsigned 
int ret;
    
int i;
    
for (ret = 0 , i = SIZE_OF_UNSIGNEDINT - 1 ; i >= 0 ; -- i)
    {
     ret 
= ret << 8 ;
     ret 
|= cmd[i];  
    }  
    
return ret;


int main( void)
{
   unsigned 
char cmd[SIZE_OF_UNSIGNEDINT];
   unsigned 
int data, ret;
   unsigned 
char * p;
   
int i;
   data 
= 0x12345678 ;
   printf( 
"data = %x"" , data);
    // 以字节为单位打印出数据 
    p = (unsigned char *)( & data);
    
for(i = 0 ; i < SIZE_OF_UNSIGNEDINT; ++ i)
    {
   printf( 
" %x " , * p ++);
    } 
    printf( 
" "");
    //以相反的顺序存放到cmd之中 
    put_32(cmd, data);
    
for (i = 0 ; i < SIZE_OF_UNSIGNEDINT; ++ i)
    {
    printf( 
" cmd[%d] = %x"" , i, cmd[i]);
    } 
    
// 再以相反的顺序保存数据到ret中
    
// 保存之后的ret数值应该与data相同 
    ret = get_32(cmd);
    printf( 
" ret = %x"" , ret);
    p = (unsigned char *)( & ret);
    
for(i = 0 ; i < SIZE_OF_UNSIGNEDINT; ++ i)
    {
    printf( 
" %x " , * p ++);
    } 
    printf( 
" "");
    getchar();
    
return 0 ;

posted @ 2009-06-19 10:51  辛勤耕耘  阅读(457)  评论(0)    收藏  举报