将 unsigned int 转换为字节数组并返回

Converting unsigned int to byte array and back

对于我的 C++ 个人项目,我一直在研究将一些数据保存在二进制文件中。我对 Google 做了一些研究,发现了几种或多或少归结为同一件事的方法。但是,我终其一生都无法使读取或写入方法正常工作。我写的任何值,我都会以不同的方式返回。我在谷歌上对此进行了广泛搜索,并查看了 Whosebug,但我还没有真正找到解决方案,所以我开始认为我一定是忽略了一些东西,但我终究无法弄清楚是什么。

下面讨论的两种读取和写入无符号短整数的方法。

unsigned short ReadUShort(std::ifstream& ifs)
{
    unsigned char buffer[2];

    ifs.read((char*)buffer, 2);
    unsigned short val = (buffer[0] << 8) | buffer[1];

    return val;
}

void WriteUShort(std::ofstream& ofs, unsigned short val)
{
    unsigned char buffer[2];

    buffer[0] = (val & 0xff);
    buffer[1] = ((val >> 8) & 0xff);

    ofs.write((char*)buffer, 2);
}

提前感谢您提供的所有帮助。

您的 read 例程以大端顺序读取(最高有效字节在前),而您的 write 例程以小端顺序写入(最低有效字节在前)。您必须二选一。

大端实现:

unsigned short ReadUShort(std::ifstream& ifs)
{
    unsigned char buffer[2];

    ifs.read((char*)buffer, 2);
    unsigned short val = (buffer[0] << 8) | buffer[1];

    return val;
}

void WriteUShort(std::ofstream& ofs, unsigned short val)
{
    unsigned char buffer[2];

    //SWAPPED FROM LITTLE-ENDIAN TO BIG-ENDIAN
    buffer[0] = ((val >> 8) & 0xff); 
    buffer[1] = (val & 0xff);

    ofs.write((char*)buffer, 2);
}

你把它反过来了。在阅读期间试试这个:

unsigned short val = ((unsigned short)buffer[1] << 8) | buffer[0];