20 BO_LE = BO_LITTLE_ENDIAN,
21 BO_BE = BO_BIG_ENDIAN,
27 DT_SHORT, DT_INT, DT_LONG, DT_FLOAT, DT_DOUBLE
33 inline ByteOrder NativeByteOrder(
void )
35 static int iByteOrderTest = 0x1;
37 if ( *((
char *) &iByteOrderTest) == 0x1 )
38 return BO_LITTLE_ENDIAN;
48 inline short SwapShort(
short data )
50 return (data << 8) | ((data >> 8) & 0x00ff);
52 inline long SwapLong(
long data )
54 assert(
sizeof(
long) == 4 );
55 return ( data << 24 ) | (( data << 8 ) & 0x00FF0000 ) |
56 (( data >> 24 ) & 0x000000FF ) | (( data >> 8 ) & 0x0000FF00 );
58 inline int SwapInt(
int data )
65 return SwapLong( (
long)data );
67 inline float SwapFloat(
float data )
69 assert(
sizeof(
float) ==
sizeof(
long) );
70 long s = SwapLong( *((
long *)&data) );
71 return *((
float *)&s);
73 inline double SwapDouble(
double data )
75 assert(
sizeof(
double) == 2*
sizeof(
long) );
76 char *p = (
char *)&data;
77 long l1 = *((
long *)( p + 0 )),
78 l2 = *((
long *)( p +
sizeof(long) ));
79 *((
long *)( p + 0 )) = SwapLong( l2 );
80 *((
long *)( p +
sizeof(
long) )) = SwapLong( l1 );
92 inline short SwapBytes(
short data,
94 ByteOrder desired_order )
96 if ( data_order == BO_MACHINE ) data_order = NativeByteOrder();
97 if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
98 if ( data_order == desired_order )
101 return SwapShort( data );
104 inline long SwapBytes(
long data,
105 ByteOrder data_order,
106 ByteOrder desired_order )
108 if ( data_order == BO_MACHINE ) data_order = NativeByteOrder();
109 if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
110 if ( data_order == desired_order )
113 return SwapLong( data );
116 inline int SwapBytes(
int data,
117 ByteOrder data_order,
118 ByteOrder desired_order )
120 if ( data_order == BO_MACHINE ) data_order = NativeByteOrder();
121 if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
122 if ( data_order == desired_order )
125 return SwapInt( data );
128 inline float SwapBytes(
float data,
129 ByteOrder data_order,
130 ByteOrder desired_order )
132 if ( data_order == BO_MACHINE ) data_order = NativeByteOrder();
133 if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
134 if ( data_order == desired_order )
137 return SwapFloat( data );
140 inline double SwapBytes(
double data,
141 ByteOrder data_order,
142 ByteOrder desired_order )
144 if ( data_order == BO_MACHINE ) data_order = NativeByteOrder();
145 if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
146 if ( data_order == desired_order )
149 return SwapDouble( data );
152 void SwapMemBytes(
void *items, DataType type,
size_t count,
153 ByteOrder file_order, ByteOrder desired_order );
155 size_t FRead(
void *ptr, DataType type,
size_t nitems, FILE *stream,
156 ByteOrder file_order, ByteOrder desired_order = BO_MACHINE );
158 size_t GZFRead(
void *ptr, DataType type,
size_t nitems, gzFile gzstream,
159 ByteOrder file_order, ByteOrder desired_order = BO_MACHINE );
161 size_t FWrite(
void *ptr, DataType type,
size_t nitems, FILE *stream,
162 ByteOrder file_order, ByteOrder data_order = BO_MACHINE );
164 size_t GZFWrite(
void *ptr, DataType type,
size_t nitems, gzFile gzstream,
165 ByteOrder file_order, ByteOrder data_order = BO_MACHINE );