访问基于二进制格式文档的特定二进制信息

Accessing specific binary information based on binary format documentation

本文关键字:二进制 信息 格式 访问 文档      更新时间:2023-10-16

我有一个二进制文件和存储信息的格式文档。我试图用c++写一个简单的程序,从文件中提取特定的信息,但我错过了一些东西,因为输出不是我期望的。

文档如下:

<>之前半字字段名称类型单位范围精度10块分路器INT*2 N/A -1 N/A11-12纬度INT*4度-90至+90 0.001之前

显然文件中还有其他项目,但在这种情况下,我只想获得纬度值。

我的代码是:
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
  char* dataFileLocation = "testfile.bin";
  ifstream dataFile(dataFileLocation, ios::in | ios::binary);
  if(dataFile.is_open())
  {
    char* buffer = new char[32768];
    dataFile.seekg(10, ios::beg);
    dataFile.read(buffer, 4);
    dataFile.close();
    cout << "value is << (int)(buffer[0] & 255);
  }
}

结果是"value is 226",不在允许的范围内。

我对这个很陌生,这是我写上面代码时的意图:

  1. 以二进制模式打开文件
  2. 查找从文件开始的第11个字节
  3. 从该点读取4字节
  4. 关闭
  5. 将这4个字节输出为整数
如果有人能指出我错在哪里,我将不胜感激。我不太明白(buffer[0] &255)部分(取自一些示例代码),因此非常感谢外行人的术语。

前100字节的十六进制转储:

testfile.bin  98,402 bytes   11/16/2011   9:01:52
          -0 -1 -2 -3  -4 -5 -6 -7  -8 -9 -A -B  -C -D -E -F
00000000- 00 5F 3B BF  00 00 C4 17  00 00 00 E2  2E E0 00 00 [._;.............]
00000001- 00 03 FF FF  00 00 94 70  FF FE 81 30  00 00 00 5F [.......p...0..._]
00000002- 00 02 00 00  00 00 00 00  3B BF 00 00  C4 17 3B BF [........;.....;.]
00000003- 00 00 C4 17  00 00 00 00  00 00 00 00  80 02 00 00 [................]
00000004- 00 05 00 0A  00 0F 00 14  00 19 00 1E  00 23 00 28 [.............#.(]
00000005- 00 2D 00 32  00 37 00 3C  00 41 00 46  00 00 00 00 [.-.2.7.<.A.F....]
00000006- 00 00 00 00                                        [....            ]

由于文档将字段列出为整数,但显示精度为0.001,因此我假设实际值是存储值乘以0.001。整数范围为-90000到90000。

这4个字节必须组合成一个整数。有两种方法可以做到这一点,大端序和小端序,您需要哪种方式取决于编写文件的机器。例如,x86 pc是小端序。

int little_endian = buffer[0] | buffer[1]<<8 | buffer[2]<<16 | buffer[3]<<24;
int big_endian    = buffer[0]<<24 | buffer[1]<<16 | buffer[2]<<8 | buffer[3];

&255用于删除在将有符号字符转换为有符号整数时发生的符号扩展。使用unsigned char代替,你可能就不需要它了。

编辑:我认为"半字"是指2个字节,所以你需要跳过20个字节而不是10个。