Browse Source

improving decoding performance for unaligned access targets

Stasik0 9 years ago
parent
commit
43bfb03c07
1 changed files with 11 additions and 11 deletions
  1. 11 11
      src/ua_types_encoding_binary.c

+ 11 - 11
src/ua_types_encoding_binary.c

@@ -143,7 +143,7 @@ UA_StatusCode UA_UInt16_decodeBinary(UA_ByteString const *src, size_t *UA_RESTRI
 
 #ifdef UA_ALIGNED_MEMORY_ACCESS
     *dst = (UA_UInt16) src->data[(*offset)++] << 0;
-    *dst += (UA_UInt16) src->data[(*offset)++] << 8;
+    *dst |= (UA_UInt16) src->data[(*offset)++] << 8;
 #else
     *dst = *((UA_UInt16*) &src->data[*offset]);
     *offset += 2;
@@ -183,9 +183,9 @@ UA_StatusCode UA_UInt32_decodeBinary(UA_ByteString const *src, size_t *UA_RESTRI
 
 #ifdef UA_ALIGNED_MEMORY_ACCESS
     *dst = (UA_UInt32)((UA_Byte)(src->data[(*offset)++] & 0xFF));
-    *dst += (UA_UInt32)((UA_Byte)(src->data[(*offset)++] & 0xFF) << 8);
-    *dst += (UA_UInt32)((UA_Byte)(src->data[(*offset)++] & 0xFF) << 16);
-    *dst += (UA_UInt32)((UA_Byte)(src->data[(*offset)++] & 0xFF) << 24);
+    *dst |= (UA_UInt32)((UA_Byte)(src->data[(*offset)++] & 0xFF) << 8);
+    *dst |= (UA_UInt32)((UA_Byte)(src->data[(*offset)++] & 0xFF) << 16);
+    *dst |= (UA_UInt32)((UA_Byte)(src->data[(*offset)++] & 0xFF) << 24);
 #else
     *dst = *((UA_UInt32*) &src->data[*offset]);
     *offset += 4;
@@ -229,13 +229,13 @@ UA_StatusCode UA_UInt64_decodeBinary(UA_ByteString const *src, size_t *UA_RESTRI
 
 #ifdef UA_ALIGNED_MEMORY_ACCESS
     *dst = (UA_UInt64) src->data[(*offset)++];
-    *dst += (UA_UInt64) src->data[(*offset)++] << 8;
-    *dst += (UA_UInt64) src->data[(*offset)++] << 16;
-    *dst += (UA_UInt64) src->data[(*offset)++] << 24;
-    *dst += (UA_UInt64) src->data[(*offset)++] << 32;
-    *dst += (UA_UInt64) src->data[(*offset)++] << 40;
-    *dst += (UA_UInt64) src->data[(*offset)++] << 48;
-    *dst += (UA_UInt64) src->data[(*offset)++] << 56;
+    *dst |= (UA_UInt64) src->data[(*offset)++] << 8;
+    *dst |= (UA_UInt64) src->data[(*offset)++] << 16;
+    *dst |= (UA_UInt64) src->data[(*offset)++] << 24;
+    *dst |= (UA_UInt64) src->data[(*offset)++] << 32;
+    *dst |= (UA_UInt64) src->data[(*offset)++] << 40;
+    *dst |= (UA_UInt64) src->data[(*offset)++] << 48;
+    *dst |= (UA_UInt64) src->data[(*offset)++] << 56;
 #else
     *dst = *((UA_UInt64*) &src->data[*offset]);
     *offset += 8;