使用C++中的位移位器和缓冲区读取二进制文件
我试图读取一个二进制文件,并将数据简单地转换为可用的无符号整数。下面的代码适用于某些文件位置的2字节读取,并正确打印无符号整数。当我使用4字节代码时,虽然我的值比它应该的大很多。我相信问题在于read函数,例如,我似乎得到了错误的字符/十进制数101,当位移位成为一个远大于其应为6662342的数字时。当程序运行时,它会不时抛出一个异常,然后在visual Studio中围绕变量buf RUNTING error 2进行堆栈。有什么想法吗?这可能是我关于数据如何存储在影响数据输出的字符数组中的基本知识 工作2字节代码使用C++中的位移位器和缓冲区读取二进制文件,c++,bit-shift,C++,Bit Shift,我试图读取一个二进制文件,并将数据简单地转换为可用的无符号整数。下面的代码适用于某些文件位置的2字节读取,并正确打印无符号整数。当我使用4字节代码时,虽然我的值比它应该的大很多。我相信问题在于read函数,例如,我似乎得到了错误的字符/十进制数101,当位移位成为一个远大于其应为6662342的数字时。当程序运行时,它会不时抛出一个异常,然后在visual Studio中围绕变量buf RUNTING error 2进行堆栈。有什么想法吗?这可能是我关于数据如何存储在影响数据输出的字符数组中的基
unsigned char buf[2];
file.seekg(3513);
uint64_t value = readBufferLittleEndian(buf, &file);
printf("%i", value);
system("PAUSE");
return 0;
}
uint64_t readBufferLittleEndian(unsigned char buf[], std::ifstream *file)
{
file->read((char*)(&buf[0]), 2);
return (buf[1] << 8 | buf[0]);
}
unsigned char buf[8 + 1]; //= { 0, 2 , 0 , 0 , 0 , 0 , 0, 0, 0 };
uint64_t buf1[9];
file.seekg(3213);
uint64_t value = readBufferLittleEndian(buf, &file, buf1);
std::cout << value;
system("PAUSE");
return 0;
}
uint64_t readBufferLittleEndian(unsigned char buf[], std::ifstream *file, uint64_t buf1[])
{
file->read((char*)(&buf[0]), 4);
for (int index = 0; index < 4; index++)
{
buf1[index] = buf[index];
}
buf1[0];
buf1[1];
buf1[2];
buf1[3];
//return (buf1[7] << 56 | buf1[6] << 48 | buf1[5] << 40 | buf1[4] << 32 | buf1[3] << 24 | buf1[2] << 16 | buf1[1] << 8 | buf1[0]);
return (buf1[3] << 24 | buf1[2] << 16 | buf1[1] << 8 | buf1[0]);
//return (buf1[1] << 8 | buf1[0]);
}
Please correct me if I got the endianess reversed.
中断的4字节代码
unsigned char buf[2];
file.seekg(3513);
uint64_t value = readBufferLittleEndian(buf, &file);
printf("%i", value);
system("PAUSE");
return 0;
}
uint64_t readBufferLittleEndian(unsigned char buf[], std::ifstream *file)
{
file->read((char*)(&buf[0]), 2);
return (buf[1] << 8 | buf[0]);
}
unsigned char buf[8 + 1]; //= { 0, 2 , 0 , 0 , 0 , 0 , 0, 0, 0 };
uint64_t buf1[9];
file.seekg(3213);
uint64_t value = readBufferLittleEndian(buf, &file, buf1);
std::cout << value;
system("PAUSE");
return 0;
}
uint64_t readBufferLittleEndian(unsigned char buf[], std::ifstream *file, uint64_t buf1[])
{
file->read((char*)(&buf[0]), 4);
for (int index = 0; index < 4; index++)
{
buf1[index] = buf[index];
}
buf1[0];
buf1[1];
buf1[2];
buf1[3];
//return (buf1[7] << 56 | buf1[6] << 48 | buf1[5] << 40 | buf1[4] << 32 | buf1[3] << 24 | buf1[2] << 16 | buf1[1] << 8 | buf1[0]);
return (buf1[3] << 24 | buf1[2] << 16 | buf1[1] << 8 | buf1[0]);
//return (buf1[1] << 8 | buf1[0]);
}
Please correct me if I got the endianess reversed.
代码是C++,除了Prtf线< /p> 在移位之前必须进行转换。不能将字符左移56位
ie do uint64_tbuf[n]参见KG0=字节1,参见KG3212=字节3213。考虑到我现在得到220表示大端性,我不完全确定为什么我以前在字节3214中得到零。得到220表示我正在解释seekg的功能。哦,不管怎样,现在重要的地方都解决了。它打印出负值,因为您使用了错误的格式。另外,不要混合C和C++,使用STD::CUT代替Prtf。我认为它可能是简单的,将所有位移改为8,而不是8的因素,但是这会打印出比预期低的数字。在BUF运行时错误2周围的正确格式是什么?对于uint64_t而言,printf也假设int的大小,不一定是64位的。如果我对第二个数组buf1[]进行了手动强制转换,它是否应该已经解决了这个问题。如果我观察buf1[]的索引,它们会打印出正确的二进制移位值。看起来read函数似乎有点问题,例如,当我遵循buf的第二个索引时,它被指定为101“无论101是什么字符”。然后将此值分配给uint64\t数组后,第二个索引仅为101。然后,我可以正确地进行移位。然而,101首先并不是正确的答案。这可能只是因为我对这些数组中字节存储的基本概念是错误的。您现在描述的是不同的程序,很难在不看到它们的情况下进行评论。要做到这一点,摆脱读取,手动设置8字节数组,并使用alterals,看看会发生什么。另外,试着将一个字节移位不同的量,看看会发生什么,这里没有巫术。用手动设置的4字节和8字节数组测试了位移位,它肯定有效。现在唯一的问题是在读取文件时,我应该在3513位置获得{220,5,0,0},但是buf[0]=0 buf[1]=101'e',buf1[1]=101。所以我对读取函数的理解肯定有问题。假设它计算每个字节中的位并将它们存储为字符/值,我错了吗?请注意,您并不是在测试读取是否有效-您可能有垃圾