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

SFD*_*SFD 1 c++

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

我正在做以下事情:

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

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

char* ptr = avector.data();
int n = *ptr;
ptr += sizeof(int);
Run Code Online (Sandbox Code Playgroud)

这似乎仅在IF <= 127时起作用.当n> 127时,因为在这个例子中'n'得到一个奇怪的值而不是200.

Sla*_*ica 6

在这段代码中:

char* ptr = avector.data();
int n = *ptr;
Run Code Online (Sandbox Code Playgroud)

您正在将一个字节转换为int解除引用char指针.你需要的是复制数据:

char* ptr = avector.data();
int n = 0;
memcpy( &n, ptr, sizeof(n) );
Run Code Online (Sandbox Code Playgroud)

要么:

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

您应该知道这不是便携式解决方案.

不能做的是:

char* ptr = avector.data();
int n = *(int*)ptr;
Run Code Online (Sandbox Code Playgroud)

虽然它看起来很合理,并且会编译,但实际上很受欢迎,甚至可能看起来有效,但它违反了严格的别名规则.您可以查看对象 - 如果它是char[],但不是相反.无论可移植性如何,此处都需要副本.

  • @kerrytazi可能会工作,但违反了严格别名,因此未定义的行为. (3认同)