소스 검색

Merge branch 'endianness' of https://github.com/acplt/open62541 into endiannes

Stasik0 10 년 전
부모
커밋
bdeb52f668
1개의 변경된 파일15개의 추가작업 그리고 36개의 파일을 삭제
  1. 15 36
      src/ua_types_encoding_binary.c

+ 15 - 36
src/ua_types_encoding_binary.c

@@ -1,4 +1,8 @@
 #include <string.h>
+#ifndef WIN32
+#define __USE_BSD
+#include <endian.h>
+#endif
 #include "ua_types_encoding_binary.h"
 #include "ua_util.h"
 #include "ua_statuscodes.h"
@@ -138,26 +142,15 @@ UA_StatusCode UA_UInt64_decodeBinary(UA_ByteString const *src, size_t *offset, U
 
 /* Float */
 UA_TYPE_CALCSIZEBINARY_MEMSIZE(UA_Float)
-// FIXME: Implement NaN, Inf and Zero(s)
 UA_Byte UA_FLOAT_ZERO[] = { 0x00, 0x00, 0x00, 0x00 };
 UA_StatusCode UA_Float_decodeBinary(UA_ByteString const *src, size_t *offset, UA_Float * dst) {
     if(*offset + sizeof(UA_Float) > (size_t)src->length )
         return UA_STATUSCODE_BADDECODINGERROR;
-    UA_Float mantissa;
-    UA_UInt32 biasedExponent;
-    UA_Float sign;
-    if(memcmp(&src->data[*offset], UA_FLOAT_ZERO, 4) == 0)
-        return UA_Int32_decodeBinary(src, offset, (UA_Int32 *)dst);
-    mantissa = (UA_Float)(src->data[*offset] & 0xFF);                                   // bits 0-7
-    mantissa = (mantissa / (UA_Float)256.0 ) + (UA_Float)(src->data[*offset+1] & 0xFF); // bits 8-15
-    mantissa = (mantissa / (UA_Float)256.0 ) + (UA_Float)(src->data[*offset+2] & 0x7F); // bits 16-22
-    biasedExponent  = (src->data[*offset+2] & 0x80) >>  7;                              // bits 23
-    biasedExponent |= (UA_UInt32)(src->data[*offset+3] & 0x7F) <<  1;                   // bits 24-30
-    sign = ( src->data[*offset+ 3] & 0x80 ) ? -1.0 : 1.0;                               // bit 31
-    if(biasedExponent >= 127)
-        *dst = (UA_Float)sign * (1ULL << (biasedExponent-127)) * (1.0 + mantissa / 128.0 );
-    else
-        *dst = (UA_Float)sign * 2.0 * (1.0 + mantissa / 128.0 ) / ((UA_Float)(biasedExponent-127));
+    UA_Float value = *((UA_Float*)&src->data[*offset]);
+#ifndef WIN32
+    value = le32toh(value);
+#endif
+    *dst = value;
     *offset += 4;
     return UA_STATUSCODE_GOOD;
 }
@@ -173,26 +166,12 @@ UA_Byte UA_DOUBLE_ZERO[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
 UA_StatusCode UA_Double_decodeBinary(UA_ByteString const *src, size_t *offset, UA_Double * dst) {
     if(*offset + sizeof(UA_Double) > (UA_UInt32)src->length )
         return UA_STATUSCODE_BADDECODINGERROR;
-    UA_Double sign;
-    UA_Double mantissa;
-    UA_UInt32 biasedExponent;
-    if(memcmp(&src->data[*offset], UA_DOUBLE_ZERO, 8) == 0)
-        return UA_Int64_decodeBinary(src, offset, (UA_Int64 *)dst);
-    mantissa = (UA_Double)(src->data[*offset] & 0xFF);                         // bits 0-7
-    mantissa = (mantissa / 256.0 ) + (UA_Double)(src->data[*offset+1] & 0xFF); // bits 8-15
-    mantissa = (mantissa / 256.0 ) + (UA_Double)(src->data[*offset+2] & 0xFF); // bits 16-23
-    mantissa = (mantissa / 256.0 ) + (UA_Double)(src->data[*offset+3] & 0xFF); // bits 24-31
-    mantissa = (mantissa / 256.0 ) + (UA_Double)(src->data[*offset+4] & 0xFF); // bits 32-39
-    mantissa = (mantissa / 256.0 ) + (UA_Double)(src->data[*offset+5] & 0xFF); // bits 40-47
-    mantissa = (mantissa / 256.0 ) + (UA_Double)(src->data[*offset+6] & 0x0F); // bits 48-51
-    biasedExponent  = (src->data[*offset+6] & 0xF0) >>  4; // bits 52-55
-    biasedExponent |= ((UA_UInt32)(src->data[*offset+7] & 0x7F)) <<  4; // bits 56-62
-    sign = ( src->data[*offset+7] & 0x80 ) ? -1.0 : 1.0; // bit 63
-    if(biasedExponent >= 1023)
-        *dst = (UA_Double)sign * (1ULL << (biasedExponent-1023)) * (1.0 + mantissa / 8.0 );
-    else
-        *dst = (UA_Double)sign * 2.0 *
-            (1.0 + mantissa / 8.0 ) / ((UA_Double)(biasedExponent-1023));
+
+    UA_Double value = *((UA_Double*)&src->data[*offset]);
+#ifndef WIN32
+    value = le64toh(value);
+#endif
+    *dst = value;
     *offset += 8;
     return UA_STATUSCODE_GOOD;
 }