00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef ZenUtilsH
00015 #define ZenUtilsH
00016
00017
00018
00019 #include "ZenLib/int128u.h"
00020
00021
00022 namespace ZenLib
00023 {
00024
00025
00026
00027
00028
00029
00030
00031 int8s LittleEndian2int8s (const char* List);
00032 int8u LittleEndian2int8u (const char* List);
00033 int16s LittleEndian2int16s (const char* List);
00034 int16u LittleEndian2int16u (const char* List);
00035 int32s LittleEndian2int24s (const char* List);
00036 int32u LittleEndian2int24u (const char* List);
00037 int32s LittleEndian2int32s (const char* List);
00038 int32u LittleEndian2int32u (const char* List);
00039 #if (MAXTYPE_INT >= 64)
00040 int64s LittleEndian2int40s (const char* List);
00041 int64u LittleEndian2int40u (const char* List);
00042 int64s LittleEndian2int48s (const char* List);
00043 int64u LittleEndian2int48u (const char* List);
00044 int64s LittleEndian2int56s (const char* List);
00045 int64u LittleEndian2int56u (const char* List);
00046 int64s LittleEndian2int64s (const char* List);
00047 int64u LittleEndian2int64u (const char* List);
00048 int128u LittleEndian2int128u (const char* List);
00049 #endif
00050 float32 LittleEndian2float16 (const char* List);
00051 float32 LittleEndian2float32 (const char* List);
00052 float64 LittleEndian2float64 (const char* List);
00053 float80 LittleEndian2float80 (const char* List);
00054
00055 void int8s2LittleEndian (char* List, int8s Value);
00056 void int8u2LittleEndian (char* List, int8u Value);
00057 void int16s2LittleEndian (char* List, int16s Value);
00058 void int16u2LittleEndian (char* List, int16u Value);
00059 void int24s2LittleEndian (char* List, int32s Value);
00060 void int24u2LittleEndian (char* List, int32u Value);
00061 void int32s2LittleEndian (char* List, int32s Value);
00062 void int32u2LittleEndian (char* List, int32u Value);
00063 #if (MAXTYPE_INT >= 64)
00064 void int40s2LittleEndian (char* List, int64s Value);
00065 void int40u2LittleEndian (char* List, int64u Value);
00066 void int48s2LittleEndian (char* List, int64s Value);
00067 void int48u2LittleEndian (char* List, int64u Value);
00068 void int56s2LittleEndian (char* List, int64s Value);
00069 void int56u2LittleEndian (char* List, int64u Value);
00070 void int64s2LittleEndian (char* List, int64s Value);
00071 void int64u2LittleEndian (char* List, int64u Value);
00072 void int128u2LittleEndian (char* List, int128u Value);
00073 #endif
00074 void float162LittleEndian (char* List, float32 Value);
00075 void float322LittleEndian (char* List, float32 Value);
00076 void float642LittleEndian (char* List, float64 Value);
00077 void float802LittleEndian (char* List, float80 Value);
00078
00079 #ifndef __BORLANDC__
00080 inline int8s LittleEndian2int8s (const int8u* List) {return LittleEndian2int8s ((const char*)List);}
00081 inline int8u LittleEndian2int8u (const int8u* List) {return LittleEndian2int8u ((const char*)List);}
00082 inline int16s LittleEndian2int16s (const int8u* List) {return LittleEndian2int16s ((const char*)List);}
00083 inline int16u LittleEndian2int16u (const int8u* List) {return LittleEndian2int16u ((const char*)List);}
00084 inline int32s LittleEndian2int24s (const int8u* List) {return LittleEndian2int24s ((const char*)List);}
00085 inline int32u LittleEndian2int24u (const int8u* List) {return LittleEndian2int24u ((const char*)List);}
00086 inline int32s LittleEndian2int32s (const int8u* List) {return LittleEndian2int32s ((const char*)List);}
00087 inline int32u LittleEndian2int32u (const int8u* List) {return LittleEndian2int32u ((const char*)List);}
00088 #if (MAXTYPE_INT >= 64)
00089 inline int64s LittleEndian2int40s (const int8u* List) {return LittleEndian2int40s ((const char*)List);}
00090 inline int64u LittleEndian2int40u (const int8u* List) {return LittleEndian2int40u ((const char*)List);}
00091 inline int64s LittleEndian2int48s (const int8u* List) {return LittleEndian2int48s ((const char*)List);}
00092 inline int64u LittleEndian2int48u (const int8u* List) {return LittleEndian2int48u ((const char*)List);}
00093 inline int64s LittleEndian2int56s (const int8u* List) {return LittleEndian2int56s ((const char*)List);}
00094 inline int64u LittleEndian2int56u (const int8u* List) {return LittleEndian2int56u ((const char*)List);}
00095 inline int64s LittleEndian2int64s (const int8u* List) {return LittleEndian2int64s ((const char*)List);}
00096 inline int64u LittleEndian2int64u (const int8u* List) {return LittleEndian2int64u ((const char*)List);}
00097 inline int128u LittleEndian2int128u (const int8u* List) {return LittleEndian2int64u ((const char*)List);}
00098 #endif
00099 inline float32 LittleEndian2float16 (const int8u* List) {return LittleEndian2float16 ((const char*)List);}
00100 inline float32 LittleEndian2float32 (const int8u* List) {return LittleEndian2float32 ((const char*)List);}
00101 inline float64 LittleEndian2float64 (const int8u* List) {return LittleEndian2float64 ((const char*)List);}
00102 inline float80 LittleEndian2float80 (const int8u* List) {return LittleEndian2float80 ((const char*)List);}
00103
00104 inline void int8s2LittleEndian (int8u* List, int8s Value) {return int8s2LittleEndian ((char*)List, Value);}
00105 inline void int8u2LittleEndian (int8u* List, int8u Value) {return int8u2LittleEndian ((char*)List, Value);}
00106 inline void int16s2LittleEndian (int8u* List, int16s Value) {return int16s2LittleEndian ((char*)List, Value);}
00107 inline void int16u2LittleEndian (int8u* List, int16u Value) {return int16u2LittleEndian ((char*)List, Value);}
00108 inline void int24s2LittleEndian (int8u* List, int32s Value) {return int24s2LittleEndian ((char*)List, Value);}
00109 inline void int24u2LittleEndian (int8u* List, int32u Value) {return int24u2LittleEndian ((char*)List, Value);}
00110 inline void int32s2LittleEndian (int8u* List, int32s Value) {return int32s2LittleEndian ((char*)List, Value);}
00111 inline void int32u2LittleEndian (int8u* List, int32u Value) {return int32u2LittleEndian ((char*)List, Value);}
00112 #if (MAXTYPE_INT >= 64)
00113 inline void int40s2LittleEndian (int8u* List, int64s Value) {return int40s2LittleEndian ((char*)List, Value);}
00114 inline void int40u2LittleEndian (int8u* List, int64u Value) {return int40u2LittleEndian ((char*)List, Value);}
00115 inline void int48s2LittleEndian (int8u* List, int64s Value) {return int48s2LittleEndian ((char*)List, Value);}
00116 inline void int48u2LittleEndian (int8u* List, int64u Value) {return int48u2LittleEndian ((char*)List, Value);}
00117 inline void int56s2LittleEndian (int8u* List, int64s Value) {return int56s2LittleEndian ((char*)List, Value);}
00118 inline void int56u2LittleEndian (int8u* List, int64u Value) {return int56u2LittleEndian ((char*)List, Value);}
00119 inline void int64s2LittleEndian (int8u* List, int64s Value) {return int64s2LittleEndian ((char*)List, Value);}
00120 inline void int64u2LittleEndian (int8u* List, int64u Value) {return int64u2LittleEndian ((char*)List, Value);}
00121 inline void int128u2LittleEndian (int8u* List, int128u Value) {return int128u2LittleEndian ((char*)List, Value);}
00122 #endif
00123 inline void float162LittleEndian (int8u* List, float32 Value) {return float162LittleEndian ((char*)List, Value);}
00124 inline void float322LittleEndian (int8u* List, float32 Value) {return float322LittleEndian ((char*)List, Value);}
00125 inline void float642LittleEndian (int8u* List, float64 Value) {return float642LittleEndian ((char*)List, Value);}
00126 inline void float802LittleEndian (int8u* List, float80 Value) {return float802LittleEndian ((char*)List, Value);}
00127 #endif //__BORLANDC__
00128
00129
00130
00131 int8s BigEndian2int8s (const char* List);
00132 int8u BigEndian2int8u (const char* List);
00133 int16s BigEndian2int16s (const char* List);
00134 int16u BigEndian2int16u (const char* List);
00135 int32s BigEndian2int24s (const char* List);
00136 int32u BigEndian2int24u (const char* List);
00137 int32s BigEndian2int32s (const char* List);
00138 int32u BigEndian2int32u (const char* List);
00139 #if (MAXTYPE_INT >= 64)
00140 int64s BigEndian2int40s (const char* List);
00141 int64u BigEndian2int40u (const char* List);
00142 int64s BigEndian2int48s (const char* List);
00143 int64u BigEndian2int48u (const char* List);
00144 int64s BigEndian2int56s (const char* List);
00145 int64u BigEndian2int56u (const char* List);
00146 int64s BigEndian2int64s (const char* List);
00147 int64u BigEndian2int64u (const char* List);
00148 int128u BigEndian2int128u (const char* List);
00149 #endif
00150 float32 BigEndian2float16 (const char* List);
00151 float32 BigEndian2float32 (const char* List);
00152 float64 BigEndian2float64 (const char* List);
00153 float80 BigEndian2float80 (const char* List);
00154
00155 void int8s2BigEndian (char* List, int8s Value);
00156 void int8u2BigEndian (char* List, int8u Value);
00157 void int16s2BigEndian (char* List, int16s Value);
00158 void int16u2BigEndian (char* List, int16u Value);
00159 void int24s2BigEndian (char* List, int32s Value);
00160 void int24u2BigEndian (char* List, int32u Value);
00161 void int32s2BigEndian (char* List, int32s Value);
00162 void int32u2BigEndian (char* List, int32u Value);
00163 #if (MAXTYPE_INT >= 64)
00164 void int40s2BigEndian (char* List, int64s Value);
00165 void int40u2BigEndian (char* List, int64u Value);
00166 void int48s2BigEndian (char* List, int64s Value);
00167 void int48u2BigEndian (char* List, int64u Value);
00168 void int56s2BigEndian (char* List, int64s Value);
00169 void int56u2BigEndian (char* List, int64u Value);
00170 void int64s2BigEndian (char* List, int64s Value);
00171 void int64u2BigEndian (char* List, int64u Value);
00172 void int128u2BigEndian (char* List, int128u Value);
00173 #endif
00174 void float162BigEndian (char* List, float32 Value);
00175 void float322BigEndian (char* List, float32 Value);
00176 void float642BigEndian (char* List, float64 Value);
00177 void float802BigEndian (char* List, float80 Value);
00178
00179 #ifndef __BORLANDC__
00180 inline int8s BigEndian2int8s (const int8u* List) {return BigEndian2int8s ((const char*)List);}
00181 inline int8u BigEndian2int8u (const int8u* List) {return BigEndian2int8u ((const char*)List);}
00182 inline int16s BigEndian2int16s (const int8u* List) {return BigEndian2int16s ((const char*)List);}
00183 inline int16u BigEndian2int16u (const int8u* List) {return BigEndian2int16u ((const char*)List);}
00184 inline int32s BigEndian2int32s (const int8u* List) {return BigEndian2int32s ((const char*)List);}
00185 inline int32u BigEndian2int24u (const int8u* List) {return BigEndian2int24u ((const char*)List);}
00186 inline int32s BigEndian2int24s (const int8u* List) {return BigEndian2int24s ((const char*)List);}
00187 inline int32u BigEndian2int32u (const int8u* List) {return BigEndian2int32u ((const char*)List);}
00188 #if (MAXTYPE_INT >= 64)
00189 inline int64s BigEndian2int40s (const int8u* List) {return BigEndian2int40s ((const char*)List);}
00190 inline int64u BigEndian2int40u (const int8u* List) {return BigEndian2int40u ((const char*)List);}
00191 inline int64s BigEndian2int48s (const int8u* List) {return BigEndian2int48s ((const char*)List);}
00192 inline int64u BigEndian2int48u (const int8u* List) {return BigEndian2int48u ((const char*)List);}
00193 inline int64s BigEndian2int56s (const int8u* List) {return BigEndian2int56s ((const char*)List);}
00194 inline int64u BigEndian2int56u (const int8u* List) {return BigEndian2int56u ((const char*)List);}
00195 inline int64s BigEndian2int64s (const int8u* List) {return BigEndian2int64s ((const char*)List);}
00196 inline int64u BigEndian2int64u (const int8u* List) {return BigEndian2int64u ((const char*)List);}
00197 inline int128u BigEndian2int128u (const int8u* List) {return BigEndian2int128u ((const char*)List);}
00198 #endif
00199 inline float32 BigEndian2float16 (const int8u* List) {return BigEndian2float16 ((const char*)List);}
00200 inline float32 BigEndian2float32 (const int8u* List) {return BigEndian2float32 ((const char*)List);}
00201 inline float64 BigEndian2float64 (const int8u* List) {return BigEndian2float64 ((const char*)List);}
00202 inline float80 BigEndian2float80 (const int8u* List) {return BigEndian2float80 ((const char*)List);}
00203
00204 inline void int8s2BigEndian (int8u* List, int8s Value) {return int8s2BigEndian ((char*)List, Value);}
00205 inline void int8u2BigEndian (int8u* List, int8u Value) {return int8u2BigEndian ((char*)List, Value);}
00206 inline void int16s2BigEndian (int8u* List, int16s Value) {return int16s2BigEndian ((char*)List, Value);}
00207 inline void int16u2BigEndian (int8u* List, int16u Value) {return int16u2BigEndian ((char*)List, Value);}
00208 inline void int24s2BigEndian (int8u* List, int32s Value) {return int24s2BigEndian ((char*)List, Value);}
00209 inline void int24u2BigEndian (int8u* List, int32u Value) {return int24u2BigEndian ((char*)List, Value);}
00210 inline void int32s2BigEndian (int8u* List, int32s Value) {return int32s2BigEndian ((char*)List, Value);}
00211 inline void int32u2BigEndian (int8u* List, int32u Value) {return int32u2BigEndian ((char*)List, Value);}
00212 #if (MAXTYPE_INT >= 64)
00213 inline void int40s2BigEndian (int8u* List, int64s Value) {return int40s2BigEndian ((char*)List, Value);}
00214 inline void int40u2BigEndian (int8u* List, int64u Value) {return int40u2BigEndian ((char*)List, Value);}
00215 inline void int48s2BigEndian (int8u* List, int64s Value) {return int48s2BigEndian ((char*)List, Value);}
00216 inline void int48u2BigEndian (int8u* List, int64u Value) {return int48u2BigEndian ((char*)List, Value);}
00217 inline void int56s2BigEndian (int8u* List, int64s Value) {return int56s2BigEndian ((char*)List, Value);}
00218 inline void int56u2BigEndian (int8u* List, int64u Value) {return int56u2BigEndian ((char*)List, Value);}
00219 inline void int64s2BigEndian (int8u* List, int64s Value) {return int64s2BigEndian ((char*)List, Value);}
00220 inline void int64u2BigEndian (int8u* List, int64u Value) {return int64u2BigEndian ((char*)List, Value);}
00221 inline void int128u2BigEndian (int8u* List, int128u Value) {return int128u2BigEndian ((char*)List, Value);}
00222 #endif
00223 inline void float162BigEndian (int8u* List, float32 Value) {return float162BigEndian ((char*)List, Value);}
00224 inline void float322BigEndian (int8u* List, float32 Value) {return float322BigEndian ((char*)List, Value);}
00225 inline void float642BigEndian (int8u* List, float64 Value) {return float642BigEndian ((char*)List, Value);}
00226 inline void float802BigEndian (int8u* List, float80 Value) {return float802BigEndian ((char*)List, Value);}
00227 #endif //__BORLANDC__
00228
00229
00230
00231 int64s int32s_int64s ( int32s High, int32u Low);
00232 int64u int32u_int64u ( int32u High, int32u Low);
00233 void int32s_int64s (int64s &BigInt, int32s High, int32u Low);
00234 void int32u_int64u (int64s &BigInt, int32u High, int32u Low);
00235 void int64s_int32s (int64s BigInt, int32s &High, int32u &Low);
00236 void int64u_int32u (int64u BigInt, int32u &High, int32u &Low);
00237
00238
00239
00240 int32s float32_int32s (float32 F, bool Rounded=true);
00241 int64s float32_int64s (float32 F, bool Rounded=true);
00242 int32s float64_int32s (float64 F, bool Rounded=true);
00243 int64s float64_int64s (float64 F, bool Rounded=true);
00244
00245
00246 #if defined(_MSC_VER) && _MSC_VER<=1200
00247 inline float32 int64u_float32 (int64u v) {return static_cast<float32>(static_cast<int64s>(v>>1))*2.0f + static_cast<float32>(static_cast<int64s>(v & 1));}
00248 inline float64 int64u_float64 (int64u v) {return static_cast<float64>(static_cast<int64s>(v>>1))*2.0f + static_cast<float32>(static_cast<int64s>(v & 1));}
00249 #else
00250 inline float32 int64u_float32 (int64u v) {return (float32)v;}
00251 inline float64 int64u_float64 (int64u v) {return (float64)v;}
00252 #endif // defined(_MSC_VER) && _MSC_VER<=1200
00253
00254
00255
00256 inline int64u CC8(const char* C) {return BigEndian2int64u(C);}
00257 inline int64u CC7(const char* C) {return BigEndian2int56u(C);}
00258 inline int64u CC6(const char* C) {return BigEndian2int48u(C);}
00259 inline int64u CC5(const char* C) {return BigEndian2int40u(C);}
00260 inline int32u CC4(const char* C) {return BigEndian2int32u(C);}
00261 inline int32u CC3(const char* C) {return BigEndian2int24u(C);}
00262 inline int16u CC2(const char* C) {return BigEndian2int16u(C);}
00263 inline int8u CC1(const char* C) {return BigEndian2int8u (C);}
00264 #ifndef __BORLANDC__
00265 inline int64u CC8(const int8u* C) {return BigEndian2int64u(C);}
00266 inline int64u CC7(const int8u* C) {return BigEndian2int56u(C);}
00267 inline int64u CC6(const int8u* C) {return BigEndian2int48u(C);}
00268 inline int64u CC5(const int8u* C) {return BigEndian2int40u(C);}
00269 inline int32u CC4(const int8u* C) {return BigEndian2int32u(C);}
00270 inline int32u CC3(const int8u* C) {return BigEndian2int24u(C);}
00271 inline int16u CC2(const int8u* C) {return BigEndian2int16u(C);}
00272 inline int8u CC1(const int8u* C) {return BigEndian2int8u (C);}
00273 #endif // __BORLANDC__
00274
00275
00276
00277
00278
00279 #define HEX__(n) 0x##n##LU
00280
00281
00282 #define B8__(x) ((x&0x0000000FLU)?0x01:0) \
00283 +((x&0x000000F0LU)?0x02:0) \
00284 +((x&0x00000F00LU)?0x04:0) \
00285 +((x&0x0000F000LU)?0x08:0) \
00286 +((x&0x000F0000LU)?0x10:0) \
00287 +((x&0x00F00000LU)?0x20:0) \
00288 +((x&0x0F000000LU)?0x40:0) \
00289 +((x&0xF0000000LU)?0x80:0)
00290
00291
00292 #define B8(d) ((int8u)B8__(HEX__(d)))
00293
00294
00295 #define B16(dmsb, dlsb) (((int16u)B8(dmsb)<<8) \
00296 + ((int16u)B8(dlsb)<<0))
00297
00298
00299 #define B32(dmsb, db2, db3, dlsb) (((int32u)B8(dmsb)<<24) \
00300 + ((int32u)B8( db2)<<16) \
00301 + ((int32u)B8( db3)<< 8) \
00302 + ((int32u)B8(dlsb)<< 0))
00303
00304 }
00305 #endif