簡體   English   中英

從二進制文件中讀取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

那是因為你正在施放一個解除引用的值。 即只有一個char 4個字節。 *U106

您可以在沒有中間緩沖區的情況下讀取數據:

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

不同之處在於,您在這里重新解釋指針,而不是其下的值。

如果您仍想使用緩沖區,則應該是*reinterpret_cast<unsigned long*>(U); ,這也會重新解釋指針1st,然后取消引用它。 關鍵是取消引用適當類型的指針。 指針類型決定了值的使用字節數。

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();

試試out=*reinterpret_cast<unsigned long *>(U);

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

便攜式讀取二進制文件非常棘手。 我在github上放了一些代碼

https://github.com/MalcolmMcLean/ieee754

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM