从二进制文件中读取未签名的长整型文件

read unsigned long from binary file

本文关键字:长整型 文件 二进制文件 读取      更新时间:2023-10-16

我正在尝试从二进制文件中读取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

这是因为您正在转换一个取消引用的值。 即只有char而不是完整的 4 个字节。 *U106.

您可以在没有中间缓冲区的情况下读取数据:

infile.read(reinterpret_cast<char*>(&out), sizeof out);

不同之处在于,您在这里重新解释指针,而不是它下面的值。

如果仍然想使用缓冲区,则应*reinterpret_cast<unsigned long*>(U);,这也将重新解释指针 1st,然后取消引用它。关键是取消引用正确类型的指针。指针的类型确定用于值的字节数。

out=static_cast(U); 应该是 out=(无符号长 *)(U);

它可以简单得多:

infile.open("file.bin", std::ios::in | std::ios::binary);
unsigned long out=0;
infile.read((char *)&out, sizeof(out));
infile.close();

尝试out=*reinterpret_cast<unsigned long *>(U);<</p>

div class="answers">

您需要知道文件(不是程序)是大端序还是小端序。然后用 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字节序还是小端序,它都可以工作。如果文件是小端序,则交换 fgetc() 的顺序。

可移植地读取二进制文件非常棘手。我已经在 github 上放了一些代码

https://github.com/MalcolmMcLean/ieee754