diff options
author | dec05eba <dec05eba@protonmail.com> | 2018-10-15 23:46:47 +0200 |
---|---|---|
committer | dec05eba <0xdec05eba@gmail.com> | 2018-10-15 23:46:53 +0200 |
commit | 7947431ec1e837b2149e94b81e505fe4516ee5c6 (patch) | |
tree | b56f4428f30175794a25aa302b50263f1005e0b8 /sibs/SafeSerializer.hpp | |
parent | 6807296fb2107276dc164b25e13426317757e734 (diff) |
Fix missaligned read/write2.0.0
Diffstat (limited to 'sibs/SafeSerializer.hpp')
-rw-r--r-- | sibs/SafeSerializer.hpp | 31 |
1 files changed, 4 insertions, 27 deletions
diff --git a/sibs/SafeSerializer.hpp b/sibs/SafeSerializer.hpp index 0aa53c5..68b6e7c 100644 --- a/sibs/SafeSerializer.hpp +++ b/sibs/SafeSerializer.hpp @@ -5,6 +5,7 @@ #include "../utils.hpp" #include <vector> #include <cstring> +#include <algorithm> namespace sibs { @@ -24,33 +25,9 @@ namespace sibs void add(const T &data) { usize offset = buffer.size(); - buffer.resize(buffer.size() + sizeof(T)); + buffer.insert(buffer.end(), (unsigned char*)&data, (unsigned char*)&data + sizeof(T)); #if BYTE_ORDER == BIG_ENDIAN - switch(sizeof(T)) - { - case 1: - *(T*)&buffer[offset] = data; - break; - case 2: - *(u16*)&buffer[offset] = byteswap(*(u16*)&data); - break; - case 4: - *(u32*)&buffer[offset] = byteswap(*(u32*)&data); - break; - case 8: - *(u64*)&buffer[offset] = byteswap(*(u64*)&data); - break; - default: - { - for(int i = 0; i < sizeof(T); ++i) - { - buffer[offset + i] = ((char*)&data)[sizeof(T) - 1 - i]; - } - break; - } - } - #else - *(T*)&buffer[offset] = data; + std::reverse((char*)&buffer[offset], (char*)&buffer[offset] + sizeof(T)); #endif } @@ -60,7 +37,7 @@ namespace sibs { usize offset = buffer.size(); buffer.resize(buffer.size() + size); - memcpy(&buffer[offset], data, size); + memmove(&buffer[offset], data, size); } } |