aboutsummaryrefslogtreecommitdiff
path: root/sibs/SafeDeserializer.hpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2018-10-15 23:46:47 +0200
committerdec05eba <0xdec05eba@gmail.com>2018-10-15 23:46:53 +0200
commit7947431ec1e837b2149e94b81e505fe4516ee5c6 (patch)
treeb56f4428f30175794a25aa302b50263f1005e0b8 /sibs/SafeDeserializer.hpp
parent6807296fb2107276dc164b25e13426317757e734 (diff)
Fix missaligned read/write2.0.0
Diffstat (limited to 'sibs/SafeDeserializer.hpp')
-rw-r--r--sibs/SafeDeserializer.hpp30
1 files changed, 4 insertions, 26 deletions
diff --git a/sibs/SafeDeserializer.hpp b/sibs/SafeDeserializer.hpp
index 7eb8aaf..57d2eee 100644
--- a/sibs/SafeDeserializer.hpp
+++ b/sibs/SafeDeserializer.hpp
@@ -5,6 +5,7 @@
#include "../utils.hpp"
#include <cstring>
#include <stdexcept>
+#include <algorithm>
namespace sibs
{
@@ -37,32 +38,9 @@ namespace sibs
verifyExtractSize(typeSize);
size -= typeSize;
T result;
+ memmove(&result, data, typeSize);
#if BYTE_ORDER == BIG_ENDIAN
- switch(typeSize)
- {
- case 1:
- result = *(T*)data;
- break;
- case 2:
- *(u16*)&result = byteswap(*(u16*)data);
- break;
- case 4:
- *(u32*)&result = byteswap(*(u32*)data);
- break;
- case 8:
- *(u64*)&result = byteswap(*(u64*)data);
- break;
- default:
- {
- for(int i = 0; i < typeSize; ++i)
- {
- ((char*)&result)[i] = data[typeSize - 1 - i];
- }
- break;
- }
- }
- #else
- result = *(T*)data;
+ std::reverse((char*)&result, (char*)&result + typeSize);
#endif
data += typeSize;
return result;
@@ -77,7 +55,7 @@ namespace sibs
{
verifyExtractSize(destinationSize);
size -= destinationSize;
- memcpy(destination, data, destinationSize);
+ memmove(destination, data, destinationSize);
data += destinationSize;
}
}