Changeset 6228 in orxonox.OLD for branches/network/src/lib
- Timestamp:
- Dec 21, 2005, 2:50:20 PM (19 years ago)
- Location:
- branches/network/src/lib/network
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/network/src/lib/network/converter.cc
r6219 r6228 80 80 81 81 /*! 82 * Converts an int into a byte-array and stores the result into a given byte-array 83 * @remarks: The int is stored in big-endian 84 * @param x: The int which is to convert 85 * @return: A byte-array that accords the given int value 86 */ 87 int Converter::intToByteArray(int x, byte* a, int length) 88 { 89 if (length < INTSIZE) 90 { 91 PRINTF(1)("byte buffer to short to store an int. Needed length %i. Avaiable length %i", INTSIZE, length); 92 return -1; 93 } 94 95 const int mod = 256; // = 2^8 96 97 int sgn; 98 if (x >= 0) 99 sgn = 1; 100 else 101 { 102 sgn = -1; 103 x = -x; 104 } 105 106 for (int i = 0; i < INTSIZE; i++) 107 { 108 a[i] = x % mod; 109 x /= mod; 110 } 111 112 if (sgn == -1) 113 a[INTSIZE - 1] += sgnadd; 114 115 return INTSIZE; 116 } 117 118 /*! 82 119 * Converts a byte-array into an int 83 120 * @param a: The byte-array which is to convert 84 121 * @return: An int that accords the given byte-array 85 122 */ 86 int Converter::byteArrayToInt(const byte* a )123 int Converter::byteArrayToInt(const byte* a, int* x) 87 124 { 88 125 int mult = 1; 89 126 const int step = 256; // = 2 ^ 8 90 int result= 0;127 *x = 0; 91 128 for (int i = 0; i < INTSIZE - 1; i++) 92 129 { 93 result+= a[i] * mult;130 *x += a[i] * mult; 94 131 mult *= step; 95 132 } … … 97 134 if (a[INTSIZE - 1] >= sgnadd) 98 135 { 99 result+= (a[INTSIZE - 1] - sgnadd) * mult;100 result*= -1;101 } 102 else 103 result+= a[INTSIZE - 1] * mult;104 105 return result;136 *x += (a[INTSIZE - 1] - sgnadd) * mult; 137 *x *= -1; 138 } 139 else 140 *x += a[INTSIZE - 1] * mult; 141 142 return INTSIZE; 106 143 } 107 144 … … 267 304 return result; 268 305 } 306 307 /*! 308 * Converts a float value into a byte-array and stores the result into a given byte-array 309 * @param x: The float which is to convert 310 * @return: A byte-array which accords the given float 311 */ 312 int Converter::floatToByteArray(float x, byte* a, int length) 313 { 314 if (length < FLOATSIZE) 315 { 316 PRINTF(1)("byte buffer to short to store a float. Needed length %i. Avaiable length %i", FLOATSIZE, length); 317 return -1; 318 } 319 int mantisse = 0; 320 int exponent = 128; 321 322 int sgn; 323 if (x < 0) 324 { 325 x = -x; 326 sgn = -1; 327 } 328 else 329 sgn = 1; 330 331 float sub = 1; 332 while (sub < x) 333 { 334 sub *= 2; 335 exponent++; 336 } 337 338 while (x > 0) 339 { 340 if (x >= sub) 341 { 342 mantisse += 1; 343 x -= sub; 344 } 345 346 mantisse *= 2; 347 exponent--; 348 sub /= 2; 349 } 350 exponent++; 351 mantisse /= 2; 352 while (mantisse < expmult) 353 { 354 mantisse *= 2; 355 exponent--; 356 } 357 358 //printf("mantisse = %i exponent = %i \n", mantisse, exponent); 359 360 mantisse -= expmult; 361 362 int hx = mantisse + expmult * exponent; 363 int result = intToByteArray(hx, a, length); 364 if (sgn == -1) 365 a[3] += sgnadd; 366 367 return result; 368 } 369 370 371 /*! 372 * Converts a byte-array into a float value 373 * @param a: The byte-array which is to convert 374 * @return: A float value which accords the given byte-array 375 */ 376 int Converter::byteArrayToFloat(byte* a, float* x) 377 { 378 int hmant = a[0] + a[1] * 256 + a[2] * 65536; 379 int mantisse = hmant % expmult; 380 mantisse += expmult; 381 382 int hexp = a[2] + a[3] * 256; 383 int exponent = (hexp / 128) % 256 - 128; 384 385 int sgn; 386 if (a[3] >= sgnadd) 387 sgn = -1; 388 else 389 sgn = 1; 390 391 //printf("mantisse = %i exponent = %i \n", mantisse, exponent); 392 393 float emult = 1; 394 if (exponent > 0) 395 for (int i = 0; i < exponent; i++) 396 emult *= 2; 397 else if (exponent < 0) 398 for (int i = 0; i > exponent; i--) 399 emult /= 2; 400 401 *x = mantisse * emult; 402 if (sgn == -1) 403 *x = - *x; 404 405 return FLOATSIZE; 406 } -
branches/network/src/lib/network/converter.h
r6225 r6228 15 15 /* The size of an int in byte */ 16 16 #define INTSIZE 4 17 /* The size of a float in byte */ 18 #define FLOATSIZE 4 17 19 18 20 /*! … … 26 28 27 29 static int intToByteArray(int x, byte* a, int length); 28 static int byteArrayToInt( byte* a, int* x);30 static int byteArrayToInt(const byte* a, int* x); 29 31 30 static int floatToByteArray(float x, byte* a, int length);31 static int byteArrayToFloat( byte* a, float* x);32 static int floatToByteArray(float x, const byte* a, int length); 33 static int byteArrayToFloat(const byte* a, float* x); 32 34 33 35 //Test
Note: See TracChangeset
for help on using the changeset viewer.