如果我们有一个POD结构说A,我这样做:
char* ptr = reinterpret_cast<char*>(A);
char buf[20];
for (int i =0;i<20; ++i)
buf[i] = ptr[i];
network_send(buf,..);
如果接收端远程盒不一定是相同的硬件或操作系统,我可以安全地执行此操作以“反序列化”:
void onRecieve(..char* buf,..) {
A* result = reinterpret_cast<A*>(buf); // given same bytes in same order from the sending end
“结果”总是有效吗? C ++标准规定了POD结构,reinterpret_cast的结果应该指向第一个成员,但它是否意味着实际的字节顺序也是正确的,即使接收端是一个不同的平台?
答案 0 :(得分:1)
char*
,永远不要回到对象指针:
Source Destination
\ /
\ /
V V
read as char* ---> write as if to char*
在代码中:
Foo Source;
Foo Destination;
char buf[sizeof(Foo)];
// Serialize:
char const * ps = reinterpret_cast<char const *>(&Source);
std::copy(ps, ps + sizeof(Foo), buf);
// Deserialize:
char * pd = reinterpret_cast<char *>(&Destination);
std::copy(buf, buf + sizeof(Foo), pd);
简而言之:如果你想要一个对象,你必须拥有一个对象。你不能只假装一个随机存储位置是一个对象,如果它实际上不是(即如果它不是所需类型的实际对象的地址)。
答案 1 :(得分:0)
您可以考虑使用模板,让编译器为您处理
template<typename T>
struct base_type {
union {
T scalar;
char bytes[sizeof(T)];
};
void serialize(T val, byte* dest) {
scalar = val;
if is_big_endian { /* swap bytes and write */ }
else { /* just write */ }
}
};