根据大端模式或小端模式取得数据方法

/*
*@1 在各种体系的计算机中通常采用的字节存储机制主要有两种:
*   big-endian和little-endian,即大端模式和小端模式
*@2 MSB:Most Significant Bit ------- 最高有效位
*    LSB:Least Significant Bit ------- 最低有效位
*                                                               
*@3    举例:大端模式:最高有效位存放在最低端的地址上
*        小断模式:最低有效位存放在最低端的地址上
*@4    判断大端小端:联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CPU对内存采用 
*         Little-endian还是Big-endian模式读写,详见本博客"c语言算法归纳"之大端小端检测方法
*@5 利用交换两个变量的方法取得该地址的值
*@6 如果是8位有效数值的话,不论是大端模式还是小端模式,取得的值是一样的
*/

/*8位数据,ofs:0代表低端地址,1代表高端地址*/
#define LOAD8(ptr,ofs)        (((uint8*)(ptr))[ofs])

/*如果知道了处理器的存储机制,如果是大端模式下如何求其值*/

/*大端模式16位数据*/
#define SWAP16(a)        ((uint16)((((uint32)(a) >> 8) & 0xFF) | (((uint32)(a) << 8) & 0xFF00)))
#define INT16BE(a)        SWAP16(a)
#define LOAD16BE(ptr)    INT16BE(*(uint16*)(ptr))

/*大端模式32位数据*/
#define SWAP32(a)        ((((uint32)(a) >> 24) & 0x000000FF) | (((uint32)(a) >> 8) & 0x0000FF00)|\
(((uint32)(a) << 8) & 0x00FF0000) | (((uint32)(a) << 24) & 0xFF000000))
#define INT32BE(a)        SWAP32(a)
#define LOAD32BE(ptr)    INT32BE(*(uint32*)(ptr))

/*大端模式64位数据*/
#define SWAP64(a)        (((uint64)SWAP32(a) << 32) | SWAP32((uint64)(a)>>32))
#define INT64BE(a)        SWAP64(a)
#define LOAD64BE(ptr)    INT64BE(*(uint64*)(ptr))

/*如果知道了处理器的存储机制,如果是小端模式下如何求其值*/

/*小端模式16位数据*/
#define INT16LE(a)        (a)
#define LOAD16LE(ptr)    INT16LE(*(uint16*)(ptr))

/*小端模式32位数据*/
#define INT32LE(a)        (a)
#define LOAD32LE(ptr)    INT32LE(*(uint32*)(ptr))

/*小端模式64位数据*/
#define INT64LE(a)        (a)
#define LOAD64LE(ptr)        INT64LE(*(uint64*)(ptr))

你可能感兴趣的:(c,算法,存储,语言)