gpt4 book ai didi

c++ - 从文件中读取二进制给出负数

转载 作者:行者123 更新时间:2023-11-28 07:02:31 28 4
gpt4 key购买 nike

大家好,这可能是一个简单而愚蠢的问题,但却让我头疼了一段时间。我正在从命名二进制标记文件中读取数据,并且代码正常工作,但当我尝试读取大端数字时除外。获取整数的代码如下所示:

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

这段代码最初有效(给出了正确的正值),但现在无论出于何种原因,我得到的值要么溢出要么下溢。我错过了什么?

最佳答案

您的字节顺序交换没问题,但是从字节序列构建整数却不行。

首先,你弄错了字节顺序:你读入的第一个字节成为最重要的字节,而它应该是相反的。

然后,当对数组中的字符进行 OR 运算时,请注意它们被提升为 int,对于带符号的 char,设置很多额外的位,除非您将它们屏蔽掉。

最后,当longnum_bytes宽时,需要sign-extend位。

此代码有效:

union {
long s; // Signed result
unsigned long u; // Use unsigned for safe bit-shifting
} result;

int i = num_bytes-1;
if (buff[i] & 0x80)
result.s = -1; // sign-extend
else
result.s = 0;
for (; i >= 0; --i)
result.u = (result.u << 8) | (0xff & buff[i]);
return result.s;

关于c++ - 从文件中读取二进制给出负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22230676/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com