将无符号 int 转换为字节数组并返回

Converting unsigned int to byte array and back

本文关键字:字节数 数组 返回 字节 无符号 int 转换      更新时间:2023-10-16

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

在两种有问题的读取和写入方法下面,有一个无符号的短文。

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];