Чтение в Intel Hex файле для сортировки C ++ - PullRequest
3 голосов
/ 22 июля 2010

Мне нужно прочитать в файле Intel Hex, который выглядит примерно так:

:0300000002F8D42F
:07000300020096000000005E
:07000B000200B50000000037
:030013000200D414
:03001B000200F3ED  

(Да, некоторые строки отсутствуют, а иногда 1 строка содержит только 1 байт)
: Это стартовый код
Первые 2 байта - это число байтов
Следующие 4 адреса в памяти
Следующая 2 - тип записи
Остальные данные (кроме последних 2 байтов)
последние 2 байта являются контрольной суммой
Подробнее здесь (википедия)

Мне нужно в конечном итоге что-то вроде этого (без периодов, только для удобства чтения):

:10.addr.RT.10bytesofdata.CK

Если в файле нет данных для адреса, я заполняю его 'FF'

Итак, каков наилучший способ считывания и сохранения такого файла, если мне нужно разделить и отсортировать информацию по адресу, байт за байтом.
Я надеялся читать побайтово (?), Сохраняя соответствующие значения в двумерном целочисленном массиве, упорядоченном по адресу.

[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.
Спасибо за помощь, я могу опубликовать больше информации, если это не было достаточно ясно.

Обновление Так что сейчас я думаю, что я читаю что-то вроде этого:

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 ]

1 голос
/ 22 июля 2010

Я не уверен насчет 2D-массива - я бы просто начал с большого 1D-массива, представляющего (по сути) целевое адресное пространство.Предварительно заполните его FF.Просмотрите записи из шестнадцатеричного файла и:

  1. заполните значения в вашем массиве, а
  2. отслеживайте самые высокие и самые низкие адреса, которые встречались.

Когда вы закончите, начните с самого младшего из найденных адресов и кодируйте данные по 10 (10h?) Байт за раз, пока не достигнете самого высокого адреса, который вы записали.

1 голос
/ 22 июля 2010

Я бы предложил Dictionary<RT, byte[]> и просто использовал бы один плоский массив. Затем пройдитесь по этому массиву, вычисляя контрольные суммы и создавая выходные строки, если все байты в строке были 0xFF, тогда вы можете пропустить добавление этой строки к вашему выходу.

Может быть, Dictionary<RT, List<byte>>, если вы не можете заранее предсказать размер каждого пространства памяти, но так как 4 куска адреса позволяют только 64 КБ, я бы сразу выделил каждый массив этому пространству.

...