使用 reinterpret_cast 序列化和反序列化数据

serialize and deserialize datas with reinterpret_cast

本文关键字:反序列化 数据 序列化 cast reinterpret 使用      更新时间:2023-10-16

>我尝试做一些简单的事情:我有 2 个函数,第一个生成 2 个 char 数组和 1 个 int 然后将它们连接起来,reinterpret_cast为void*并返回它。

第二个将其reinterpret_cast为char*并打印出来。问题是:如果我将其reinterpret_cast为char*并在void*转换后打印它(在同一函数中(,它运行良好,但在反序列化函数中则不然。

这是我的代码:

#include <sstream>
#include <unistd.h>
void * serialize( void )
{
    char s1[9];
    char s2[9];
    int  n;
    std::string alphanum = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    s1[8] = '';
    s2[8] = '';
    for (int i = 0; i < 8; i++)
    {
        usleep(1);
        s1[i] = alphanum[clock() % (alphanum.length() - 1)];
    }
    n = clock() % 2147483647;
    for (int i = 0; i < 8; i++)
    {
        usleep(1);
        s2[i] = alphanum[clock() % (alphanum.length() - 1)];
    }
    std::cout << "s1: " << s1 << std::endl;
    std::cout << "n: " << n << std::endl;
    std::cout << "s2: " << s2 << std::endl;
    std::stringstream ss;
    std::string str;
    ss << s1 << n << s2;
    ss >> str;
    char * c = const_cast<char*>(str.c_str());
    void * d = reinterpret_cast<void*>(c);
    std::cout << reinterpret_cast<char*>(d) << std::endl; // HERE IT WORKS
    return d;
}
void deserialize( void * raw )
{
    char* c = reinterpret_cast<char*>(raw);
    std::cout << c << std::endl; //HERE IT DOESN'T WORK
}
int     main(void)
{
    void* serialized = serialize();
    deserialize(serialized);
    return 0;
}

我的输出如下所示:

s1: 6dfhkmoq n: 1857 s2: tyADFHKM 6dfhkmoq1857tyADFHKM 6�c2X� d2X�

我怎样才能拥有相同的输出?

那是因为您返回了一个指向string对象内存的指针(具有自动存储(。从cppeference

返回值

指向基础字符存储的指针。

当堆栈展开时,为字符串分配的内存将被覆盖(其内部缓冲区也是如此(。当块由于异常或到达控制流的末尾而结束时,会发生这种情况。

阅读什么是堆栈展开?

为了确保您的内存位置仍然有效,您必须将其分配给堆。您可以创建一个shared_ptr并改为返回该。

然而,reinterpret_cast通常闻起来像糟糕的设计,所以你可能想重新考虑为什么要把类型隐藏在void*

后面