4

我第一次使用二进制文件,我手里拿着一团头发。无论如何,我定义了以下内容:

unsigned int cols, rows;

这些变量可以是 1 到大约 500 之间的任何值。当我将它们写入二进制文件时,我正在这样做:

    myFile.write(reinterpret_cast<const char *>(&cols), sizeof(cols));
    myFile.write(reinterpret_cast<const char *>(&rows), sizeof(rows));

当我回去阅读文件时cols = 300,我得到以下结果:

44
1
0
0

有人可以向我解释为什么我会得到这个结果吗?我不能说有什么问题,因为我真的认为是我不明白。我想做的是将值按原样存储在文件中,这样当我读回它时,我也会得到它。也许我知道,我只是不知道。

我想解释一下这是如何工作的,以及如何获取我输入的数据。

4

4 回答 4

2

您尚未(尚未)展示您如何解组数据,也没有展示您如何打印您引用的文本。 44 01 00 00看起来像您写入的数据的每个小端字节的按字节十进制表示(十进制“300”)。

如果您像这样读取数据,它应该会给您想要的效果(假设您可以接受写入此文件的计算机与读取它的计算机具有相同字节序的限制):

unsigned int colsReadFromFile = 0;
myOtherFile.read(reinterpret_cast<char *>(&colsReadFromFile), sizeof(colsReadFromFile));
if (!myOtherFile)
{
    std::cerr << "Oh noes!" << std::endl;
}
于 2013-06-12T03:53:48.470 回答
2

您只是在查看在 little-endian 平台上解释的 32 位整数的四个字节。

300 base 10 = 0x12C

所以 little-endianness 给了你0x2C 0x01,当然0x2C=44

于 2013-06-12T03:55:14.470 回答
2

文件中的每个字节有 8 位,因此可以表示从 0 到 255 的值。它以 little-endian 顺序写入,低字节在前。因此,从另一端开始,将数字视为以 256 为底的数字。值为 0 * 256^3 + 0 * 256^2 + 1 * 256^1 + 44 * 256^0 (其中 ^ 表示取幂,而不是异或)。

于 2013-06-12T03:57:28.080 回答
1
    300 in binary is 100101100 which is 9 bits long.

但是当你说 char* 时,编译器只查找前 1 个字节(8 位)

    so it is 00101100(bits) of (1 00101100) = 44
                                  ^^^^^^^^
于 2013-06-12T04:00:29.690 回答