从文件中读取二进制给出负数(reading binary from a file gives neg

2019-10-30 02:52发布

大家好,这可能变成是一个简单的愚蠢的问题,而是一个已经让我头疼,现在有一阵子。 我是从一个命名的二进制代码文件中读取数据,并将代码工作除了当我尝试阅读大端的数字。 该得到的整数代码如下所示:

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

此代码,最初的工作(给正确的正值),但现在不管是什么原因,我得到的值或者是超过或下溢。 我在想什么?

Answer 1:

您的字节顺序交换是好的,但是从建设的字节序列的整数不大。

首先,你的存储方式错了:你在读第一个字节成为最显著字节,而应该是周围的其他方法。

然后,当OR从阵列中的字符-ing分词,要知道,他们都提升到一个int ,这对于一个有符号的char ,除非你屏蔽出来,设置了很多附加位。

最后,当long比宽num_bytes ,你需要符号扩展位。

此代码的工作:

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;


文章来源: reading binary from a file gives negative number