从二进制文件中读取 unsigned long
read unsigned long from binary file
我正在尝试从二进制文件中读取 unsigned long
数字。
我是这样做的:
infile.open("file.bin", std::ios::in | std::ios::binary);
char* U=new char[sizeof(unsigned long)];
unsigned long out=0;
infile.read(U, sizeof(unsigned long));
out=static_cast<unsigned long>(*U);
delete[] U;
U=NULL;
infile.close();
但结果不正确。
我的数据是 6A F2 6B 58 00 00 00 00
应该读作 1483469418
但在我的代码中输出是 106
这只是数据的第一个字节
有什么问题?
我应该如何从文件中正确读取 unsigned long
?
那是因为您正在转换取消引用的值。 IE。只有一个 char
未满 4 个字节。 *U
是 106
.
无需中间缓冲区即可读入数据:
infile.read(reinterpret_cast<char*>(&out), sizeof out);
不同的是,这里你重新解释指针,而不是它下面的值。
如果你还想使用缓冲区,应该是*reinterpret_cast<unsigned long*>(U);
,这也会重新解释指针1st,然后取消引用它。关键是取消引用正确类型的指针。指针的类型决定了该值使用多少字节。
尝试out=*reinterpret_cast<unsigned long *>(U);
out=static_cast(U);应该是 out=(unsigned long *)(U);
可以更简单:
infile.open("file.bin", std::ios::in | std::ios::binary);
unsigned long out=0;
infile.read((char *)&out, sizeof(out));
infile.close();
您需要知道文件(不是程序)是大端还是小端。然后使用 fgetc() 读取字节并重新组合数字
所以
unsigned long read32be(FILE *fp)
{
unsigned long ch0, ch1, ch2 ch3;
ch0 = fgetc(fp);
ch1 = fgetc(fp);
ch2 = fgetc(fp);
ch3 = fgetc(fp);
return (unsigned long) (ch0 << 24) | (ch1 << 16) | (ch2 << 8) | ch3
}
现在无论 longs 是 32 位还是 64 位,big_endian 还是小端,它都可以工作。如果 file 是小端,交换 fgetc()s 的顺序。
可移植地读取二进制文件非常棘手。我在 github
上放了一些代码
我正在尝试从二进制文件中读取 unsigned long
数字。
我是这样做的:
infile.open("file.bin", std::ios::in | std::ios::binary);
char* U=new char[sizeof(unsigned long)];
unsigned long out=0;
infile.read(U, sizeof(unsigned long));
out=static_cast<unsigned long>(*U);
delete[] U;
U=NULL;
infile.close();
但结果不正确。
我的数据是 6A F2 6B 58 00 00 00 00
应该读作 1483469418
但在我的代码中输出是 106
这只是数据的第一个字节
有什么问题?
我应该如何从文件中正确读取 unsigned long
?
那是因为您正在转换取消引用的值。 IE。只有一个 char
未满 4 个字节。 *U
是 106
.
无需中间缓冲区即可读入数据:
infile.read(reinterpret_cast<char*>(&out), sizeof out);
不同的是,这里你重新解释指针,而不是它下面的值。
如果你还想使用缓冲区,应该是*reinterpret_cast<unsigned long*>(U);
,这也会重新解释指针1st,然后取消引用它。关键是取消引用正确类型的指针。指针的类型决定了该值使用多少字节。
尝试out=*reinterpret_cast<unsigned long *>(U);
out=static_cast(U);应该是 out=(unsigned long *)(U);
可以更简单:
infile.open("file.bin", std::ios::in | std::ios::binary);
unsigned long out=0;
infile.read((char *)&out, sizeof(out));
infile.close();
您需要知道文件(不是程序)是大端还是小端。然后使用 fgetc() 读取字节并重新组合数字
所以
unsigned long read32be(FILE *fp)
{
unsigned long ch0, ch1, ch2 ch3;
ch0 = fgetc(fp);
ch1 = fgetc(fp);
ch2 = fgetc(fp);
ch3 = fgetc(fp);
return (unsigned long) (ch0 << 24) | (ch1 << 16) | (ch2 << 8) | ch3
}
现在无论 longs 是 32 位还是 64 位,big_endian 还是小端,它都可以工作。如果 file 是小端,交换 fgetc()s 的顺序。
可移植地读取二进制文件非常棘手。我在 github
上放了一些代码