应考虑字节顺序(大小端问题)的几种情况

简介:
   (From《Computer Systems,A Programer's Perspective》)在几乎所有的机器上,多字节对象被存储为连续的字节序列,对象的地址为所使用字节序列中最低字节地址。某些机器选择在存储器中按照从最低有效字节到最高有效字节的顺序存储对象,这种最低有效字节在最前面的表示方式被称为 小端法(little endian) (e.g.:Intel处理器上运行Linux,NT);某些机器则按照从最高有效字节到最低有效字节的顺序储存,这种最高有效字节在最前面的方式被称为 大端法(big endian) (e.g.:Sun Microsystem UltraSPARC运行Solaris)。一般情况下,我们不必考虑字节顺序,但在下列三种情况下,字节顺序变得非常重要:


1. 在不同类型的机器之间通过网络传送二进制数据时。一个常见的问题是当小端法机器产生的数据被发送到大端法机器或者反之时,接受程序会发现,字(word)里的字节(byte)成了反序的。为了避免这类问题,网络应用程序的代码编写必须遵守已建立的关于字节顺序的规则,以确保发送方机器将它的内部表示转换成网络标准,而接受方机器则将网络标准转换为它的内部标准。


2. 当阅读表示整数的字节序列时。这通常发生在检查机器级程序时,e.g.:反汇编得到的一条指令:
80483bd: 01 05 64 94 04 08        add %eax, 0x8049464


3. 当编写规避正常的类型系统的程序时。(e.g.:下面的几个代码示例。)

 

 

判断当前机器环境是大端法还是小端法: 

int  i = 1
unsigned 
char   *  pointer  =   & i;
if ( * pointer) // 或pointer[0]
    printf( " Little Endian " ); 
else  printf( " Big Endian " );

 

打印程序对象的字节表示:

#include  < stdio.h >
#include 
< stdlib.h >

typedef unsigned 
char   * byte_pointer;

void  show_bytes(byte_pointer start,  int  len)
{
     
int i;
     
for(i=0;i<len;i++)
         printf(
" %.2x ", start[i]);
     printf(
" ");
}


void  show_int( int  x)
{
     show_bytes((byte_pointer)
&x, sizeof(int));//使用sizeof而不是使用魔数4 
}


void  show_unsignedInt(unsigned  int  x)
{
      show_bytes((byte_pointer)
&x,sizeof(unsigned int));
}


void  show_short( short  x)
{
      show_bytes((byte_pointer)
&x,sizeof(short));
}


void  show_unsignedShort(unsigned  short  x)
{
      show_bytes((byte_pointer)
&x,sizeof(unsigned short));
}


void  show_float( float  x)
{
     show_bytes((byte_pointer)
&x, sizeof(float));
}


void  show_pointer( void   * x)
{
     show_bytes((byte_pointer)
&x, sizeof(void *));
}

 
int  main( int  argc,  char   * argv[])
{
    
int val=0x12345678;
    byte_pointer valp
=(byte_pointer)&val;
    show_bytes(valp,
1);
    show_bytes(valp,
2);
    show_bytes(valp,
3);
    show_bytes(valp,
4);
    system(
"PAUSE");    
    
return 0;
}

本文转自Silent Void博客园博客,原文链接:http://www.cnblogs.com/happyhippy/archive/2006/12/19/601222.html,如需转载请自行联系原作者
相关文章
|
7月前
|
存储
计算机存储,字节分为大端和小端
计算机存储,字节分为大端和小端
97 1
|
7月前
|
存储 网络协议 API
大端与小端概念、多字节之间与单字节多部分的大小端转换详解
大端与小端概念、多字节之间与单字节多部分的大小端转换详解
525 1
|
3月前
|
Java
Byte 高位/低位简介绍(大端格式/小端格式)
Byte 高位/低位简介绍(大端格式/小端格式)
273 1
|
7月前
|
存储 小程序 编译器
什么是“大小端字节序”存储模式?
这篇内容讨论了计算机内存中存储整型变量的方式,特别是针对不同字节序(大端和小端)的概念。文章首先解释了正负整数在内存中以补码形式存储的规则,然后提出了一个问题:当一个4字节的整数在内存中存储时,其字节是如何分布的?接着,文章引入了大端字节序和小端字节序的概念,其中大端模式将高位字节存储在低地址,小端模式则相反。文章通过示例说明了两种存储模式的区别,并提供了一道题目来判断当前机器使用的字节序。最后,给出了一个简单的程序来检测系统是大端还是小端。
115 0
什么是“大小端字节序”存储模式?
|
存储
大端法与小段法的区别
大端法与小段法的区别
366 0
|
存储 编译器 C语言
大小端字节序和整型提升
大小端字节序和整型提升
|
存储 小程序 编译器
整型在内存中的存储(详细剖析大小端)——“C”
整型在内存中的存储(详细剖析大小端)——“C”
|
存储 编译器 C语言
判断大小端问题
判断大小端问题
90 0
大小端(字节序)存储模式
大小端(字节序)存储模式
大小端(字节序)存储模式