2008年(14)
分类: c/c
2008-08-31 00:50:14
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
printf("[%x]=%x"n",&u.char[i],u.char[i]);
}
getchar();
return;
}
5,如何转换字节顺序,big-endian-->little-endian or little endian->big endian.
#include
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"n " , data);
// 以字节为单位打印出数据
p = (unsigned char *)( & data);
for(i = 0 ; i <
size_of_unsignedint; i)
{
printf( " %x " , * p );
}
printf( " "n ");
//以相反的顺序存放到cmd之中
put_32(cmd,
data);
for (i = 0 ; i < size_of_unsignedint; i)
{
printf( " cmd[%d] = %x"n " , i, cmd[i]);
}
//
再以相反的顺序保存数据到ret中
// 保存之后的ret数值应该与data相同
ret = get_32(cmd);
printf( " ret = %x"n " , ret);
p = (unsigned char *)( & ret);
for(i = 0 ; i < size_of_unsignedint; i)
{
printf( " %x " , *
p );
}
printf( " "n ");
getchar();
return 0
;
}