【问题标题】:Converting unsigned int to byte array and back将 unsigned int 转换为字节数组并返回
【发布时间】:2016-06-22 17:10:43
【问题描述】:

对于我的一个 C++ 个人项目,我一直在研究将一些数据保存在二进制文件中。我对谷歌做了一些研究,发现了几种方法,它们或多或少归结为同一件事。但是,我一生都无法使读取或写入方法正常工作。我写的任何值,我都会以不同的方式返回。我在 Google 上对此进行了广泛的搜索并查看了 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);
}

提前感谢您的任何帮助。

【问题讨论】:

    标签: c++ io binaryfiles


    【解决方案1】:

    您的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);
    }
    

    【讨论】:

    • 扇自己耳光我不敢相信我一直忽视这一点。
    • 如果可以的话,我会标记两个正确答案,因为你和上面的海报一样正确。
    【解决方案2】:

    你把它反过来了。在阅读过程中试试这个:

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

    【讨论】:

    • @RenegadeVile 很高兴这有帮助。
    猜你喜欢
    • 2012-01-11
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 2018-09-17
    相关资源
    最近更新 更多