从二进制文件中读取unsigned long

时间:2017-01-04 00:26:40

标签: c++ binaryfiles readfile

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

4 个答案:

答案 0 :(得分:3)

那是因为你正在施放一个解除引用的值。即只有char不满4个字节。 *U106

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

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

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

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

答案 1 :(得分:2)

出=的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();

答案 2 :(得分:1)

尝试example_class

答案 3 :(得分:1)

您需要知道文件(不是程序)是大端还是小端。然后用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
  }

现在它无论long是32位还是64位,big_endian还是little endian都能正常工作。如果文件是小端,请交换fgetc()s的顺序。

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

https://github.com/MalcolmMcLean/ieee754