00001
00002
00003
00004
00005
00006
00007
00008 #ifndef BYTEORDERH
00009 #define BYTEORDERH
00010
00011 #include <stdio.h>
00012 #include <assert.h>
00013
00014 enum ByteOrder
00015 {
00016 BO_LITTLE_ENDIAN,
00017 BO_BIG_ENDIAN,
00018 BO_MACHINE,
00019 BO_LE = BO_LITTLE_ENDIAN,
00020 BO_BE = BO_BIG_ENDIAN,
00021 BO_CPU = BO_MACHINE
00022 };
00023
00024 enum DataType
00025 {
00026 DT_SHORT, DT_INT, DT_LONG, DT_FLOAT, DT_DOUBLE
00027 };
00028
00032 inline ByteOrder NativeByteOrder( void )
00033 {
00034 static int iByteOrderTest = 0x1;
00035
00036 if ( *((char *) &iByteOrderTest) == 0x1 )
00037 return BO_LITTLE_ENDIAN;
00038 else
00039 return BO_BIG_ENDIAN;
00040 }
00041
00042
00043
00044
00045
00046
00047 inline short SwapShort( short data )
00048 {
00049 assert( sizeof(short) == 2 );
00050 return (data << 8) | (data >> 8);
00051 }
00052 inline long SwapLong( long data )
00053 {
00054 assert( sizeof(long) == 4 );
00055 return ( data << 24 ) | (( data << 8 ) & 0x00FF0000 ) |
00056 (( data >> 24 ) & 0x000000FF ) | (( data >> 8 ) & 0x0000FF00 );
00057 }
00058 inline int SwapInt( int data )
00059 {
00060 assert( sizeof(int) == sizeof(short) || sizeof(int) == sizeof(long) );
00061 if ( sizeof(int) == sizeof(short) )
00062 return SwapShort( (short)data );
00063 else
00064 return SwapLong( (long)data );
00065 }
00066 inline float SwapFloat( float data )
00067 {
00068 assert( sizeof(float) == sizeof(long) );
00069 long s = SwapLong( *((long *)&data) );
00070 return *((float *)&s);
00071 }
00072 inline double SwapDouble( double data )
00073 {
00074 assert( sizeof(double) == 2*sizeof(long) );
00075 char *p = (char *)&data;
00076 long l1 = *((long *)( p + 0 )),
00077 l2 = *((long *)( p + sizeof(long) ));
00078 *((long *)( p + 0 )) = SwapLong( l2 );
00079 *((long *)( p + sizeof(long) )) = SwapLong( l1 );
00080 return data;
00081 }
00082
00091 inline short SwapBytes( short data,
00092 ByteOrder data_order,
00093 ByteOrder desired_order )
00094 {
00095 if ( data_order == BO_MACHINE ) data_order = NativeByteOrder();
00096 if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
00097 if ( data_order == desired_order )
00098 return data;
00099 else
00100 return SwapShort( data );
00101 }
00102
00103 inline long SwapBytes( long data,
00104 ByteOrder data_order,
00105 ByteOrder desired_order )
00106 {
00107 if ( data_order == BO_MACHINE ) data_order = NativeByteOrder();
00108 if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
00109 if ( data_order == desired_order )
00110 return data;
00111 else
00112 return SwapLong( data );
00113 }
00114
00115 inline int SwapBytes( int data,
00116 ByteOrder data_order,
00117 ByteOrder desired_order )
00118 {
00119 if ( data_order == BO_MACHINE ) data_order = NativeByteOrder();
00120 if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
00121 if ( data_order == desired_order )
00122 return data;
00123 else
00124 return SwapInt( data );
00125 }
00126
00127 inline float SwapBytes( float data,
00128 ByteOrder data_order,
00129 ByteOrder desired_order )
00130 {
00131 if ( data_order == BO_MACHINE ) data_order = NativeByteOrder();
00132 if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
00133 if ( data_order == desired_order )
00134 return data;
00135 else
00136 return SwapFloat( data );
00137 }
00138
00139 inline double SwapBytes( double data,
00140 ByteOrder data_order,
00141 ByteOrder desired_order )
00142 {
00143 if ( data_order == BO_MACHINE ) data_order = NativeByteOrder();
00144 if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
00145 if ( data_order == desired_order )
00146 return data;
00147 else
00148 return SwapDouble( data );
00149 }
00150
00163 void SwapMemBytes( void *items, DataType type, size_t count,
00164 ByteOrder file_order, ByteOrder desired_order );
00165
00179 size_t FRead( void *ptr, DataType type, size_t nitems, FILE *stream,
00180 ByteOrder file_order, ByteOrder desired_order = BO_MACHINE );
00181
00182 #endif