/*
*@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))
*@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))