字节顺序

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  ;

你可能感兴趣的:(字节)