Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从文件中读取二进制文件会给出负数_C++_Bit Manipulation_Long Integer_Binaryfiles_Endianness - Fatal编程技术网

C++ 从文件中读取二进制文件会给出负数

C++ 从文件中读取二进制文件会给出负数,c++,bit-manipulation,long-integer,binaryfiles,endianness,C++,Bit Manipulation,Long Integer,Binaryfiles,Endianness,大家好,这可能是一个简单而愚蠢的问题,但这个问题已经让我头疼了一段时间了。我正在从一个命名的二进制标记文件中读取数据,代码正在工作,除非我尝试读取大端数字。获取整数的代码如下所示: long NBTTypes::getInteger(istream &in, int num_bytes, bool isBigEndian) { long result = 0; char buff[8]; //get bytes readData(in, buff, nu

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

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;
}
long NBTTypes::getInteger(istream&in,int-num_字节,bool-isBigEndian)
{
长结果=0;
字符buff[8];
//获取字节
readData(in、buff、num_字节、isBigEndian);
//转换为整数

cout您的字节顺序交换是好的,但是从字节序列构建整数不是好的

首先,你的尾数是错误的:你读入的第一个字节变成了最重要的字节,而它应该是相反的

然后,当
-ing从数组中输入字符时,请注意它们被提升为
int
,对于有符号的
字符
,它会设置许多附加位,除非将它们屏蔽掉

最后,当
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;
联合{
长s;//有符号结果
无符号长u;//使用无符号进行安全位移位
}结果;
int i=num_字节-1;
if(buff[i]&0x80)
result.s=-1;//符号扩展
其他的
结果:s=0;
对于(;i>=0;--i)

结果.u=(result.u您期望的数字是多少?是否可能该数字太大而无法表示为长?请尝试使用无符号长。向我们展示一个输入到
readData
和从
readData
输出的示例,包括设置
isBigEndian
。感谢您的评论。我期望的数字是128,但我得到的是-128。二进制input是一个大端短(128)。返回的字节表明我应该得到正确的答案。我感谢这个答案。我从未想过符号扩展或屏蔽!我现在离为Minecraft编程更近了一步:)
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;