gpt4 book ai didi

c++ - reinterpret_cast for 'serializing' 数据,接收端的字节顺序和对齐方式

转载 作者:行者123 更新时间:2023-11-28 08:11:03 25 4
gpt4 key购买 nike

如果我们有一个 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 的结果应该指向第一个成员,但这是否意味着实际的字节顺序也将是正确的,即使接收端是不同的平台?

最佳答案

不,你不能。您只能将“向下”强制转换为 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);

简而言之:如果您想要一个对象,您就必须拥有一个对象。你不能假装一个随机内存位置一个对象,如果它真的不是(即如果它不是所需类型的实际对象的地址)。

关于c++ - reinterpret_cast for 'serializing' 数据,接收端的字节顺序和对齐方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9059506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com