将 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];
对于我的 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];