00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00028 #ifndef ENDIAN_H
00029 #define ENDIAN_H
00030
00031
00032
00033
00034
00035 static inline void SwapBytes (void *p, unsigned int nBytes)
00036 {
00037 unsigned char *s = (unsigned char*)p;
00038 for (unsigned int i=0; i<(nBytes/2); i++) {
00039 unsigned char temp = s[i];
00040 s[i] = s[nBytes - i - 1];
00041 s[nBytes - i - 1] = temp;
00042 }
00043 }
00044
00045
00046 static inline void Swap16 (void *p)
00047 {
00048 SwapBytes (p, 2);
00049
00050
00051
00052
00053 }
00054
00055 static inline void Swap32 (void *p)
00056 {
00057 SwapBytes (p, 4);
00058
00059
00060
00061
00062
00063
00064 }
00065
00066 static inline void Swap64 (void *p)
00067 {
00068 SwapBytes (p, 8);
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 }
00079
00080
00081
00082
00083
00084 inline unsigned int SwapEndian (unsigned int v)
00085 {
00086 SwapBytes (&v, sizeof(unsigned int));
00087 return v;
00088 }
00089
00090 inline int SwapEndian (int v)
00091 {
00092 SwapBytes (&v, sizeof(int));
00093 return v;
00094 }
00095
00096 inline unsigned short SwapEndian (unsigned short v)
00097 {
00098 Swap16 (&v);
00099 return v;
00100 }
00101
00102 inline short SwapEndian (short v)
00103 {
00104 Swap16 (&v);
00105 return v;
00106 }
00107
00108 inline unsigned long SwapEndian (unsigned long v)
00109 {
00110 Swap32 (&v);
00111 return v;
00112 }
00113
00114 inline long SwapEndian (long v)
00115 {
00116 Swap32 (&v);
00117 return v;
00118 }
00119
00120 inline float SwapEndian (float v)
00121 {
00122 Swap32 (&v);
00123 return v;
00124 }
00125
00126 inline double SwapEndian (double v)
00127 {
00128 Swap64 (&v);
00129 return v;
00130 }
00131
00132
00133
00134
00135
00136
00137 static const int EndianTest = 1;
00138
00139 inline bool IsBigEndian (void)
00140 {
00141 return (*((char *) &EndianTest ) == 0);
00142 }
00143
00144 inline bool IsLittleEndian (void)
00145 {
00146 return (*((char *) &EndianTest ) != 0);
00147 }
00148
00149
00150
00151
00152
00153
00154 inline unsigned int LittleEndian (unsigned int v)
00155 {
00156 if (IsLittleEndian()) {
00157 return v;
00158 } else {
00159 return SwapEndian (v);
00160 }
00161 }
00162
00163 inline int LittleEndian (int v)
00164 {
00165 if (IsLittleEndian()) {
00166 return v;
00167 } else {
00168 return SwapEndian (v);
00169 }
00170 }
00171
00172 inline unsigned short LittleEndian (unsigned short v)
00173 {
00174 if (IsLittleEndian()) {
00175 return v;
00176 } else {
00177 return SwapEndian (v);
00178 }
00179 }
00180
00181 inline short LittleEndian (short v)
00182 {
00183 if (IsLittleEndian()) {
00184 return v;
00185 } else {
00186 return SwapEndian (v);
00187 }
00188 }
00189
00190 inline unsigned long LittleEndian (unsigned long v)
00191 {
00192 if (IsLittleEndian()) {
00193 return v;
00194 } else {
00195 return SwapEndian (v);
00196 }
00197 }
00198
00199 inline long LittleEndian (long v)
00200 {
00201 if (IsLittleEndian()) {
00202 return v;
00203 } else {
00204 return SwapEndian (v);
00205 }
00206 }
00207
00208 inline float LittleEndian (float v)
00209 {
00210 if (IsLittleEndian()) {
00211 return v;
00212 } else {
00213 return SwapEndian (v);
00214 }
00215 }
00216
00217 inline double LittleEndian (double v)
00218 {
00219 if (IsLittleEndian()) {
00220 return v;
00221 } else {
00222 return SwapEndian (v);
00223 }
00224 }
00225
00226
00227
00228
00229
00230
00231 inline unsigned int BigEndian (unsigned int v)
00232 {
00233 if (IsBigEndian()) {
00234 return v;
00235 } else {
00236 return SwapEndian (v);
00237 }
00238 }
00239
00240 inline int BigEndian (int v)
00241 {
00242 if (IsBigEndian()) {
00243 return v;
00244 } else {
00245 return SwapEndian (v);
00246 }
00247 }
00248
00249 inline unsigned short BigEndian (const unsigned short v)
00250 {
00251 if (IsBigEndian()) {
00252 return v;
00253 } else {
00254 return SwapEndian (v);
00255 }
00256 }
00257
00258 inline short BigEndian (const short v)
00259 {
00260 if (IsBigEndian()) {
00261 return v;
00262 } else {
00263 return SwapEndian (v);
00264 }
00265 }
00266
00267 inline unsigned long BigEndian (const unsigned long v)
00268 {
00269 if (IsBigEndian()) {
00270 return v;
00271 } else {
00272 return SwapEndian (v);
00273 }
00274 }
00275
00276 inline long BigEndian (const long v)
00277 {
00278 if (IsBigEndian()) {
00279 return v;
00280 } else {
00281 return SwapEndian (v);
00282 }
00283 }
00284
00285 inline float BigEndian (const float v)
00286 {
00287 if (IsBigEndian()) {
00288 return v;
00289 } else {
00290 return SwapEndian (v);
00291 }
00292 }
00293
00294 inline double BigEndian (const double v)
00295 {
00296 if (IsBigEndian()) {
00297 return v;
00298 } else {
00299 return SwapEndian (v);
00300 }
00301 }
00302
00303 #endif // ENDIAN_H