2016-03-08 62 views
1

对于C++中的个人项目,我一直在考虑保存二进制文件中的一些数据。我对谷歌做了一些研究,发现了几种这样做的方法,或多或少归结为同一件事。然而,我不能为了我的生活得到读或写方法正常工作。我写的任何价值,我都会有所不同。我对此进行了广泛的搜索,并查看了StackOverflow,并且我还没有真正找到解决方案,所以我开始认为我必须忽视某些东西,但我不能为了我的生活而弄清楚什么。将unsigned int转换为字节数组并返回

以下两种方法用于读取和写入未签名的short。

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

非常感谢您提供任何帮助。

回答

1

你有它扭转。在阅读期间试试这个:

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

这个技巧就好了。你是救生员。 –

+0

@RenegadeVile很高兴,如果这有帮助。 –

1

您的read例程以big-endian顺序读取(最重要的字节在前),而您的例程以little-endian顺序(最不重要的字节在前)写入。你必须选择一个或另一个。

大端实现:

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); 
} 
+0

*拍自己*我不敢相信我一直忽略这一点。 –

+0

如果可以的话,我会标记两个正确的答案,因为你和上面的海报一样正确。 –