#ifndef __ENDIAN_H__ #define __ENDIAN_H__ #ifndef IS_LITTLE_ENDIAN #ifdef __TI_COMPILER_VERSION__ #ifdef _BIG_ENDIAN #define IS_LITTLE_ENDIAN 0 #else #define IS_LITTLE_ENDIAN 1 #endif #else #define IS_LITTLE_ENDIAN 1 #endif #endif template inline NumberT swap_endian(const NumberT &v){ char *v_p((char *)&v); NumberT result; char *result_p((char *)&result); for(int i = 0, j = sizeof(NumberT) - 1; i < sizeof(NumberT); i++, j--){ *(result_p + i) = *(v_p + j); } return result; } #if IS_LITTLE_ENDIAN template inline NumberT le_num_2_num(const NumberT &v){ return v; } template inline NumberT be_num_2_num(const NumberT &v){ return swap_endian(v); } template inline NumberT num_2_le_num(const NumberT &v){ return v; } template inline NumberT num_2_be_num(const NumberT &v){ return swap_endian(v); } #else template inline NumberT le_num_2_num(const NumberT &v){ return swap_endian(v); } template inline NumberT be_num_2_num(const NumberT &v){ return v; } template inline NumberT num_2_le_num(const NumberT &v){ return swap_endian(v); } template inline NumberT num_2_be_num(const NumberT &v){ return v; } #endif template #if IS_LITTLE_ENDIAN inline NumberT &le_char8_2_num(const char &top){ return (NumberT &)top; } #else inline NumberT le_char8_2_num(const char &top){ char *char_p(const_cast(&top) + 7); NumberT result(0); while(true){ result |= (unsigned char)*(char_p--); if(char_p < (&top)){break;} result <<= 8; } return result; } #endif template #if IS_LITTLE_ENDIAN inline NumberT be_char8_2_num(const char &top){ char *top_p(const_cast(&top)); NumberT result(0); while(true){ result |= (unsigned char)*(top_p++); if(top_p >= ((&top) + 8)){break;} result <<= 8; } return result; } #else inline NumberT &be_char8_2_num(const char &top){ return (NumberT &)top; } #endif template #if IS_LITTLE_ENDIAN inline NumberT &le_char4_2_num(const char &top){ return (NumberT &)top; } #else inline NumberT le_char4_2_num(const char &top){ const char *top_p(&top); NumberT result(0); result |= (unsigned char)*(top_p + 3); result <<= 8; result |= (unsigned char)*(top_p + 2); result <<= 8; result |= (unsigned char)*(top_p + 1); result <<= 8; result |= (unsigned char)*(top_p); return result; } #endif template #if IS_LITTLE_ENDIAN inline NumberT be_char4_2_num(const char &top){ const char *top_p(&top); NumberT result(0); result |= (unsigned char)*(top_p); result <<= 8; result |= (unsigned char)*(top_p + 1); result <<= 8; result |= (unsigned char)*(top_p + 2); result <<= 8; result |= (unsigned char)*(top_p + 3); return result; } #else inline NumberT &be_char4_2_num(const char &top){ return (NumberT &)top; } #endif template #if IS_LITTLE_ENDIAN inline NumberT &le_char2_2_num(const char &top){ return (NumberT &)top; } #else inline NumberT le_char2_2_num(const char &top){ const char *top_p(&top); NumberT result(0); result |= (unsigned char)*(top_p + 1); result <<= 8; result |= (unsigned char)*(top_p); return result; } #endif template #if IS_LITTLE_ENDIAN inline NumberT be_char2_2_num(const char &top){ const char *top_p(&top); NumberT result(0); result |= (unsigned char)*(top_p); result <<= 8; result |= (unsigned char)*(top_p + 1); return result; } #else inline NumberT &be_char2_2_num(const char &top){ return (NumberT &)top; } #endif #endif /* __ENDIAN_H__ */