C++ 读取英特尔十六进制文件以对C++;

C++ 读取英特尔十六进制文件以对C++;,c++,file-io,hex,C++,File Io,Hex,我需要读入一个Intel十六进制文件,该文件如下所示: :0300000002F8D42F :07000300020096000000005E :07000B000200B50000000037 :030013000200D414 :03001B000200F3ED fscanf_s(in_file,"%2X", &BC); fscanf_s(in_file,"%4X", &ADDR); fscanf_s(in_file,"%2X", &RT); fprint

我需要读入一个Intel十六进制文件,该文件如下所示:

:0300000002F8D42F
:07000300020096000000005E
:07000B000200B50000000037
:030013000200D414
:03001B000200F3ED  
fscanf_s(in_file,"%2X", &BC);
fscanf_s(in_file,"%4X", &ADDR);
fscanf_s(in_file,"%2X", &RT);  
fprintf_s(out_file,"%2X", BC);
fprintf_s(out_file,"%04X", ADDR);   //this pads with zeros if needed and forces 4 "digits"  
fprintf_s(out_file,"%2X", RT);  
(是的,某些行缺失,有时一行只包含一个字节)
:是起始代码
前2个字节是字节计数
接下来的4个是内存中的地址
下一个2是记录类型
其余为数据(最后2个字节除外)
最后2个字节是校验和
更多信息

我需要这样结束(没有句点,只是为了可读性):

如果文件中没有地址的数据,我将用“FF”填充它

那么,如果我需要按地址逐个字节地对信息进行分割和排序,那么读入和存储这样的文件的最佳方式是什么呢。
我希望逐字节读取(?),将适当的值存储到按地址排序的2D整数数组中

[BC][ADDR][RT][b1][b2][b3][b4][b5][b6][b...16][ck]
[BC][ADDR][RT][b1][b2][b3][b4][b5][b6][b...16][ck]  
...  
我不想使用字符串,这样我可以更容易地计算校验和。
我也在使用Visual Studio。
谢谢你的帮助,如果这不够清楚,我可以发布更多信息

更新所以现在我想我是在读这样的东西:

:0300000002F8D42F
:07000300020096000000005E
:07000B000200B50000000037
:030013000200D414
:03001B000200F3ED  
fscanf_s(in_file,"%2X", &BC);
fscanf_s(in_file,"%4X", &ADDR);
fscanf_s(in_file,"%2X", &RT);  
fprintf_s(out_file,"%2X", BC);
fprintf_s(out_file,"%04X", ADDR);   //this pads with zeros if needed and forces 4 "digits"  
fprintf_s(out_file,"%2X", RT);  
我将打印到如下文件:

:0300000002F8D42F
:07000300020096000000005E
:07000B000200B50000000037
:030013000200D414
:03001B000200F3ED  
fscanf_s(in_file,"%2X", &BC);
fscanf_s(in_file,"%4X", &ADDR);
fscanf_s(in_file,"%2X", &RT);  
fprintf_s(out_file,"%2X", BC);
fprintf_s(out_file,"%04X", ADDR);   //this pads with zeros if needed and forces 4 "digits"  
fprintf_s(out_file,"%2X", RT);  

现在,我正在为数据编写一个例程。如果有人有什么好主意,请告诉我。谢谢

我建议使用一个
字典
,只使用一个平面数组。然后遍历该数组,计算校验和并构建输出行,如果行中的所有字节都是0xFF,则可以跳过将该行追加到输出中


如果您不能预先预测每个内存空间的大小,可能是
Dictionary
,但是由于4个半字节的地址只允许64k,我会立即将每个数组分配到该空间。

我不确定2D数组——我会从一个表示(本质上)目标地址空间的大1D数组开始。预填充FF。浏览十六进制文件中的记录,然后:

  • 将这些值填充到数组中,然后
  • 跟踪遇到的最高和最低地址
    完成后,从遇到的最低地址开始,一次编码10(10h?)字节的数据,直到达到写入的最高地址。

    公布您迄今为止所做的工作,以及您的问题所在。不确定,但不同的记录类型可能引用不同的地址空间,即使不是,RT也一定要保留。谢谢你的帮助,我想最大的问题是如何从文件中读入它。谢谢,我对你说的不太熟悉,你能再解释一下吗?哦,我使用了.NET类名。在标准C++中,将是代码> map < /C> >(并将指针设置为64KB数组)。