字节顺序
|
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"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 ; } |
天行健,君子当自强不息

浙公网安备 33010602011771号