【发布时间】:2014-03-06 16:43:46
【问题描述】:
大家好,这可能是一个简单的愚蠢问题,但现在已经让我头疼了一段时间。我正在从命名二进制标记文件中读取数据,并且代码正常工作,除非我尝试读取大端数字。获取整数的代码如下所示:
long NBTTypes::getInteger(istream &in, int num_bytes, bool isBigEndian)
{
long result = 0;
char buff[8];
//get bytes
readData(in, buff, num_bytes, isBigEndian);
//convert to integer
cout <<"Converting bytes to integer..." << endl;
result = buff[0];
cout <<"Result starts at " << result << endl;
for(int i = 1; i < num_bytes; ++i)
{
result = (result << 8) | buff[i];
cout <<"Result is now " << result << endl;
}
cout <<"Done." << endl;
return result;
}
还有readData函数:
void NBTTypes::readData(istream &in, char *buffer, unsigned long num_bytes, bool BE)
{
char hold;
//get data
in.read(buffer, num_bytes);
if(BE)
{
//convert to little-endian
cout <<"Converting to a little-endian number..." << endl;
for(unsigned long i = 0; i < num_bytes / 2; ++i)
{
hold = buffer[i];
buffer[i] = buffer[num_bytes - i - 1];
buffer[num_bytes - i - 1] = hold;
}
cout <<"Done." << endl;
}
}
此代码最初有效(给出了正确的正值),但现在无论出于何种原因,我得到的值要么上溢,要么下溢。我错过了什么?
【问题讨论】:
-
您期望的数字是多少?有没有可能这个数字太大而无法表示?试试 unsigned long 代替。
-
向我们展示
readData的输入和输出示例,包括isBigEndian的设置。 -
感谢 cmets。我期望的数字是 128,但我得到的是 -128。二进制输入是 big endian short (128)。返回的字节表明我应该得到正确的答案
标签: c++ bit-manipulation long-integer binaryfiles endianness