gpt4 book ai didi

c++ - 序列化,没有库的整数,得到奇怪的结果

转载 作者:行者123 更新时间:2023-11-30 00:43:38 25 4
gpt4 key购买 nike

我有一个整数,我想将它序列化为二进制文件。我不关心跨平台。

我正在做以下事情:

std::ofstream f;
f.open(path, std::ios::binary);
int n = 200;
f.write((char*)&n, sizeof(int));
f.close()

然后,在我使用 ifstream 再次打开文件并将其所有内容读入字符 vector 后,我执行以下操作以取回整数:

char* ptr = avector.data();
int n = *ptr;
ptr += sizeof(int);

这似乎只有在 n <= 127 时才有效。当 n > 127 时,如本例中的 'n' 得到一个奇怪的值而不是 200。

最佳答案

在这段代码中:

char* ptr = avector.data();
int n = *ptr;

您正在将一个字节转换为 int 取消引用 char 指针。您需要的是复制数据:

char* ptr = avector.data();
int n = 0;
memcpy( &n, ptr, sizeof(n) );

或者:

char* ptr = avector.data();
int n = 0;
std::copy(ptr, ptr+sizeof(n), (char*)&n);

您应该知道这不是可移植的解决方案。

不能做的是:

char* ptr = avector.data();
int n = *(int*)ptr;

虽然它可能看起来很合理,并且可以编译,但实际上非常流行,甚至可能看起来有效,但它违反了称为严格别名规则的东西。您可以将对象视为 char[],但不能反过来。无论可移植性如何,此处都需要拷贝。

关于c++ - 序列化,没有库的整数,得到奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53107964/

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