这是鄙人使用多年的方法,见笑了。
/**
* __vat - 强制获取指定内存偏移数据
* @base - 内存地址基址
* @offset - 地址偏移
*/
#ifndef __vat
# define __vat(_base,_offset) (((uint8*)(_base))[_offset])
#endif
/* 以大端格式读取16位数值 */
#define GET_BE_UINT16(pt) ( ((uint16)__vat(pt,0) << 8) \
| ((uint8 )__vat(pt,1) << 0) )
/* 以大端格式读取24位数值 */
#define GET_BE_UINT24(pt) ( ((uint32)__vat(pt,0) << 16) \
| ((uint16)__vat(pt,1) << 8) \
| ((uint8 )__vat(pt,2) << 0) )
/* 以大端格式读取32位数值 */
#define GET_BE_UINT32(pt) ( ((uint32)__vat(pt,0) << 24) \
| ((uint32)__vat(pt,1) << 16) \
| ((uint16)__vat(pt,2) << 8) \
| ((uint8 )__vat(pt,3) << 0) )
/* 以大端格式读取64位数值 */
#define GET_BE_UINT64(pt) ( ((uint64)__vat(pt,0) << 56) \
| ((uint64)__vat(pt,1) << 48) \
| ((uint64)__vat(pt,2) << 40) \
| ((uint64)__vat(pt,3) << 32) \
| ((uint32)__vat(pt,4) << 24) \
| ((uint32)__vat(pt,5) << 16) \
| ((uint16)__vat(pt,6) << 8) \
| ((uint8 )__vat(pt,7) << 0) )
/* 以大端格式写16位数值 */
#define PUT_BE_UINT16(pt,val) \
do{ \
__vat(pt,0) = (uint8)((uint16)(val) >> 8); \
__vat(pt,1) = (uint8)((uint8 )(val) >> 0); \
}while(0)
/* 以大端格式写24位数值 */
#define PUT_BE_UINT24(pt,val) \
do{ \
__vat(pt,0) = (uint8)((uint32)(val) >> 16); \
__vat(pt,1) = (uint8)((uint16)(val) >> 8); \
__vat(pt,2) = (uint8)((uint8 )(val) >> 0); \
}while(0)
/* 以大端格式写32位数值 */
#define PUT_BE_UINT32(pt,val) \
do{ \
__vat(pt,0) = (uint8)((uint32)(val) >> 24); \
__vat(pt,1) = (uint8)((uint32)(val) >> 16); \
__vat(pt,2) = (uint8)((uint16)(val) >> 8); \
__vat(pt,3) = (uint8)((uint8 )(val) >> 0); \
}while(0)
/* 以大端格式写64位数值 */
#define PUT_BE_UINT64(pt,val) \
do{ \
__vat(pt,0) = (uint8)((uint64)(val) >> 56); \
__vat(pt,1) = (uint8)((uint64)(val) >> 48); \
__vat(pt,2) = (uint8)((uint64)(val) >> 40); \
__vat(pt,3) = (uint8)((uint64)(val) >> 32); \
__vat(pt,4) = (uint8)((uint32)(val) >> 24); \
__vat(pt,5) = (uint8)((uint32)(val) >> 16); \
__vat(pt,6) = (uint8)((uint16)(val) >> 8); \
__vat(pt,7) = (uint8)((uint8 )(val) >> 0); \
}while(0)
/* 以小端格式读取16位数值 */
#define GET_LE_UINT16(pt) ( ((uint8 )__vat(pt,0) << 0) \
| ((uint16)__vat(pt,1) << 8) )
/* 以小端格式读取24位数值 */
#define GET_LE_UINT24(pt) ( ((uint8 )__vat(pt,0) << 0) \
| ((uint16)__vat(pt,1) << 8) \
| ((uint32)__vat(pt,2) << 16) )
/* 以小端格式读取32位数值 */
#define GET_LE_UINT32(pt) ( ((uint8 )__vat(pt,0) << 0) \
| ((uint16)__vat(pt,1) << 8) \
| ((uint32)__vat(pt,2) << 16) \
| ((uint32)__vat(pt,3) << 24) )
/* 以小端格式读取64位数值 */
#define GET_LE_UINT64(pt) ( ((uint8 )__vat(pt,0) << 0) \
| ((uint16)__vat(pt,1) << 8) \
| ((uint32)__vat(pt,2) << 16) \
| ((uint32)__vat(pt,3) << 24) \
| ((uint64)__vat(pt,4) << 32) \
| ((uint64)__vat(pt,5) << 40) \
| ((uint64)__vat(pt,6) << 48) \
| ((uint64)__vat(pt,7) << 56) )
/* 以小端格式写16位数值 */
#define PUT_LE_UINT16(pt,val) \
do{ \
__vat(pt,0) = (uint8)((uint8 )(val) >> 0); \
__vat(pt,1) = (uint8)((uint16)(val) >> 8); \
}while(0)
/* 以小端格式写24位数值 */
#define PUT_LE_UINT24(pt,val) \
do{ \
__vat(pt,0) = (uint8)((uint8 )(val) >> 0); \
__vat(pt,1) = (uint8)((uint16)(val) >> 8); \
__vat(pt,2) = (uint8)((uint32)(val) >> 16); \
}while(0)
/* 以小端格式写32位数值 */
#define PUT_LE_UINT32(pt,val) \
do{ \
__vat(pt,0) = (uint8)((uint8 )(val) >> 0); \
__vat(pt,1) = (uint8)((uint16)(val) >> 8); \
__vat(pt,2) = (uint8)((uint32)(val) >> 16); \
__vat(pt,3) = (uint8)((uint32)(val) >> 24); \
}while(0)
/* 以小端格式写64位数值 */
#define PUT_LE_UINT64(pt,val) \
do{ \
__vat(pt,0) = (uint8)((uint8 )(val) >> 0); \
__vat(pt,1) = (uint8)((uint16)(val) >> 8); \
__vat(pt,2) = (uint8)((uint32)(val) >> 16); \
__vat(pt,3) = (uint8)((uint32)(val) >> 24); \
__vat(pt,4) = (uint8)((uint64)(val) >> 32); \
__vat(pt,5) = (uint8)((uint64)(val) >> 40); \
__vat(pt,6) = (uint8)((uint64)(val) >> 48); \
__vat(pt,7) = (uint8)((uint64)(val) >> 56); \
}while(0) |