У меня есть файл дампа флэш-памяти, который выдает адреса и данные. Я хочу проанализировать данные, чтобы они сказали мне действительные теги. Столбец «002F0900» — это начальные адреса. Пример допустимого тега: «DC 08 00 06 00 00 07 26 01 25 05 09», где «DC 08» = номер тега, «00 06» = длина данных тега, «00 00» = версия тега. Данные тега начинаются после версии, и в этом случае это будет «07 26 01 25 05 09», а следующий тег будет начинаться с «DC 33».
Я могу распечатать первый тег до длины данных, но я не уверен, как распечатать данные, потому что я должен учитывать, перейдут ли данные на следующую строку, поэтому мне придется как-то пропустить адрес . Каждая строка содержит 58 столбцов. Каждый адрес состоит из 8 символов плюс двоеточие и 2 пробела до начала следующего шестнадцатеричного значения.
Мне также в конечном итоге придется подумать, когда в столбце адреса появится «DC». Если бы кто-нибудь мог дать совет, потому что я знаю, как я это делаю, это не лучший способ сделать это. Я просто пытаюсь заставить его работать в первую очередь.
Текстовый файл состоит из тысяч строк, которые выглядят так:
002F0900: 09 FF DC 08 00 06 00 00 07 26 01 25 05 09 DC 33
002F0910: 00 07 00 00 1F A0 26 01 25 05 09 FF 9C 3E 00 08
002F0920: 00 01 07 DD 0A 0D 00 29 35 AD 9C 41 00 0A 00 01
002F0930: 07 DD 0A 0D 00 29 36 1C 1D 01 9C 40 00 02 00 01
002F0940: 01 00 9C 42 00 0A 00 01 07 DD 0A 0D 00 29 36 21
002F0950: 1D AD 9C 15 00 20 00 00 01 00 00 00 00 04 AD AE
002F0960: C8 0B C0 8A 5B 52 01 00 00 00 00 00 FF 84 36 BA
002F0970: 4E 92 E4 16 28 86 75 C0 DC 10 00 05 00 00 00 00
002F0980: 00 00 01 FF DC 30 00 04 00 01 00 00 00 01 9C 41
Пример вывода:
Tag Number: DC 08
Address: 002E0000
Data Length: 06
Tag Data: 07 26 01 25 05 09
Исходный код:
#include<stdio.h>
FILE *fp;
main()
{
int i=0;
char ch;
char address[1024];
char tag_number[5];
char tag_length[4];
int number_of_addresses = 0;
long int length;
fp = fopen(FILE_NAME,"rb");
if(fp == NULL) {
printf("error opening file");
}
else {
printf("File opened\n");
while(1){
if((address[i]=fgetc(fp)) ==':')
break;
number_of_addresses++;
i++;
}
printf("\nAddress:");
for (i = 0; i < number_of_addresses;i++)
printf("%c",address[i]);
while((ch = fgetc(fp)) != 'D'){ //Search for valid tag
}
tag_number[0] = ch;
if((ch = fgetc(fp)) == 'C') //We have a valid TAG
{
tag_number[1] = ch;
tag_number[2] = fgetc(fp);
tag_number[3] = fgetc(fp);
tag_number[4] = fgetc(fp);
}
printf("\nNumber:");
for(i=0;i<5;i++)
printf("%c",tag_number[i]);
fgetc(fp); //For space
tag_length[0] = fgetc(fp);
tag_length[1] = fgetc(fp);
fgetc(fp); //For space
tag_length[2] = fgetc(fp);
tag_length[3] = fgetc(fp);
printf("\nLength:");
for(i=0;i<4;i++)
printf("%c",tag_length[i]);
length = strtol(tag_length,&tag_length[4], 16);
printf("\nThe decimal equilvant is: %ld",length);
for (i = 0;i<165;i++)
printf("\n%d:%c",i,fgetc(fp));
}
fclose(fp);
}
Обновление @ooga: теги написаны произвольно. Если мы также рассмотрим неверный тег в логике, тогда я смогу выяснить остальное, если потрачу некоторое время. Спасибо
\r\n
вместо простого старого\n
. Могут быть и другие аномалии. - person ooga   schedule 18.06.2014