finalize R 'wrapper' for stage 1; WARNING: changed series encoding. TODO: test
[epclust.git] / code / stage1 / src / Util / utils.c
index 9713e30..efd4dd2 100644 (file)
@@ -58,24 +58,45 @@ char readReal(FILE* stream, Real* real)
 }
 
 // convert n-bytes binary integers to uint32_t
-uint32_t bInt_to_uint(Byte* pInteger, size_t bytesCount)
+uint32_t bInt_to_uint(Byte* pInteger)
 {
-       uint32_t integer = 0;
-       for (size_t i = 0; i < bytesCount; i++)
-               integer += ((uint32_t) (pInteger[i])) << (i << 3);
-       return integer;
+       uint32_t res;
+       memcpy(&res, pInteger, 4);
+       return res;
 }
 
-// serialize integers with a portable bytes order
-void write_int(uint32_t integer, size_t bytesCount, Byte* buffer)
+// serialize integers
+void write_int(uint32_t x, Byte* buffer)
 {
-       Byte chunk;
-       // write from left to right, from least to most significative bit
-       for (size_t i = 0; i < bytesCount; i++)
-       {
-               chunk = (integer >> (i << 3)) & 0xFF;
-               buffer[i] = chunk;
-       }
+       union {
+               uint32_t i;
+               char bytes[4];
+       } u;
+       u.i = x;
+       for (size_t i = 0; i < 4; i++)
+               buffer[i] = u.bytes[i];
+}
+
+//WARNING: assuming float is 32bits...
+// convert 4-bytes binary float to float
+float bReal_to_double(Byte* pFloat)
+{
+       float res;
+       memcpy(&res, pFloat, 4);
+       return res;
+}
+
+//WARNING: assuming float is 32bits...
+// serialize double with a NON-portable bytes order
+void write_real(float x, Byte* buffer)
+{
+       union {
+               float d;
+               char bytes[4];
+       } u;
+       u.d = x;
+       for (size_t i = 0; i < 4; i++)
+               buffer[i] = u.bytes[i];
 }
 
 // Expected size of a Work message in bytes: