Avatar billede jacobf Nybegynder
06. februar 2006 - 17:48 Der er 2 kommentarer og
1 løsning

Fortolke Intel Hex Format

Jeg har brug for at fortolke og gemme informationer der er læst ud fra en fil i Intel Hex Formatet.

Et eksempel herpå er følgende (der er indsat mellemrum af pædagogiske grunde)

:10 05AA 00 000102030405060708090A0B0C0D0E0F 88

progLength = 0x10 = 16
ADDRESS = 0x05AA
RECTYPE = 00
DATA = 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
CHKSUM = 0x88

Jeg indlæser 1 linie af gangen og forestiller mig at jeg skal bruge en pointer til at iterere mig gennem arrayet. Men hvordan ???
Og hvordan får jeg de korrekte informationer ind i mine variabler?

#include<stdio.h>
#include<stdlib.h>

main(int argc, char *argv[])
{
        FILE *fp1;
        char prog[0x10000]; /* programlager hvor data fra hex-fil gemmes*/
        char progline[0x50]; /* den indlæste linie */
        char *ppl;

       
        fp1 = fopen("input.hex","r");
       
        while (fscanf(fp1,"%s",&progline) != EOF)
              {
                  ppl = progline;
                  char *progLength;
                  char *progOffset = 0;
                 
                  /* Start Code accepted */
                  if ( *ppl++ == ':' )
                  {
                        /* *ppl peger nu på 1 (se eksemepl) */
                        /* 10 (0x10) skal lægges ind i progLength */
                        /* 05AA (0x05AA) skal ind i progOffset */
                        /* 00 er ikke nødvendig at reagere på */
                        /* De efterfølgende data skal placeres fra offset (0x05AA) og fremad i prog */
                       
                  } else {
                            /* No start code found */     
                  }         
              }
}
Avatar billede driis Nybegynder
06. februar 2006 - 18:52 #1
Du kan opdele strengen for hver 2 karakterer (som skal konverteres til en byte), og bruge sscanf. Flg. eksempel kopierer blot alle bytes fra strengen over i bufferen, men du kan jo selv tilpasse så det kommer til at passe med dit beskrevne format:

#include <windows.h>
#include <stdio.h>

int HexStringToByteArray(char * str, char * bytes)
{
    char sz_tmp[3] = {0};
    int tmp = 0;
    int len = (int)strlen(str);
    int count = 0;
   
    if ( len % 2 == 0 )
    {
        for(int i = 0 ; i < len ; i += 2)
        {
            sz_tmp[0] = *(str+i);
            sz_tmp[1] = *(str+i+1);
            if ( sscanf(sz_tmp,"%x",&tmp) )
            {
                bytes[count++] = (char)tmp;
            }
        }
    }

    return count;
}

int main()
{
    char prog[0x10000]; /* programlager hvor data fra hex-fil gemmes*/
   
    char line[] = ":1005AA00000102030405060708090A0B0C0D0E0F88";
    char *ppl = line;

    if ( *ppl++ == ':' )
    {
        int c = HexStringToByteArray(ppl,prog);
        for(int i = 0 ; i < c ; i++ )
        {
            printf("%02X\n",(prog[i] & 0x000000FF));
        }
    }
}
Avatar billede driis Nybegynder
06. februar 2006 - 18:53 #2
(og ignorér linien #include windows.h; den er ikke nødvendig).
Avatar billede jacobf Nybegynder
10. februar 2006 - 17:02 #3
Takker for svaret - det gav mig en god forståelse for problemet :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester