Если вы передаете данные между машинами с одинаковым порядком байтов, вам не нужно сериализовать данные побайтно, вы можете просто отправить данные, как они представлены в памяти. В этом случае вам не нужно ничего подобного, вы можете просто использовать свой вызов memcpy следующим образом:
// Serialize
memcpy(&bytes, &val, sizeof(val));
// Deserialize
int64_t val2;
memcpy(&val2, &bytes, sizeof(val));
Если вы отправляете данные между хостами с различным порядком байтов, вы должны отправлять их так, как вы нашли их в ответе от Роджера, в основном вы должны убедиться, что данные представлены одинаково на обоих концах.
вот вариант, который не только сериализует, но и будет работать с любым типом int и на любых платформах
#include <iostream>
#include <type_traits>
using namespace std;
template <typename T> enable_if_t<is_integral_v<T>> serialize(T t, char *buf)
{
for(auto i = 0U; i < sizeof(t); ++i) {
buf[i] = t & 0xff;
t >>= 8;
}
}
template <typename T> enable_if_t<is_integral_v<T>> deserialize(T &t, char const *buf)
{
for(auto i = 0U; i < sizeof(t); ++i) {
t <<= 8;
t |= buf[sizeof(t) - 1 - i];
}
}
int main() {
int64_t t1 = 0x12345678;
int64_t t2{0};
char buffer[sizeof(t1)];
serialize(t1, buffer);
deserialize(t2, buffer);
cout << "I got " << hex << t2 << endl;
}
вам, вероятно, следует использовать контейнеры и части для сериализации / десериализации данных, чтобы убедиться, что вы не переполняете свой буфер (учитывая, что вы передаете более одного целого числа за раз)