如果我有一个通过网络进行序列化然后又作为char缓冲区接收的结构,我可以安全地将该缓冲区的一部分强制转换为,uint32_t
还是由于序列化过程中删除了填充而导致未对齐的内存访问吗?IE
typedef struct foo{
uint8_t y;
uin32_t x;
} foo;
void sendFoo(foo *f) {
//create a buffer to use
//...
buffer[0] = f->y;
uint32_t x = htonl(foo->x);
memcpy(buffer+1, (char*)&x, sizeof(uint32_t));
//...
}
foo recvFoo() {
//create some foo and a buffer for recv to work with
//...
f.y = buffer[0];
f.x = ntohl(*(uint32_t*)(buffer+1)); //potential unaligned access error?
//...
}
如果这确实导致错误,那么我应该如何反序列化此结构?
提供的信息不能保证buffer+1
正确对齐以进行32位读/写。在x86 / x64上这不是问题(可能出于性能原因除外),但是在其他平台上也可能如此。
就像你通过memcpy
在发送方上使用避免了该问题一样,memcpy
如果你希望可移植性,则可以在接收方上使用来回避该问题。
(我假设buffer
是一个char*
。)
您假设正确,对不起未包含该信息:)。那么,如何实际反序列化这样的东西呢?
添加到我的答案
需要明确的是,使用
memcpy
可能会更慢。但是,如果您要这样做,它将为您带来可移植性。