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;