Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

Hilfe mit C-Programm

Nobody666 / 12 Antworten / Flachansicht Nickles

Hallo,


hab hier anbei ein C-Programm. Es sollte am Ende so etwas wie S3 0A 00 00 00 4B 31 00 04 10 01 9B herauskommen(ohne Blanks). S3 ist hier fest, 09 sollte die anzahl der nachfolgenden Bytes sein, dann kommmen eine 4 Byte lange hexZahl, anschließend eine 5 Byte lange hexZahl und das letzte Byte sollte die Summe der Zahlen ab S3 sein.


Kann mir bitte jemand erklären, wie das ganze funktioniert, da ich es ein wenig umschreiben muß???


Danke


 


void OutputMotorolaFormat(FILE *fp, unsigned long addr, char *buffer, unsigned nbytes)
{
   unsigned i, j, bytecount, sumcheck;
   char c, *ptr = buffer;
   unsigned long localaddress = addr;


   for (i = 0; i < nbytes; i += 16) {
      bytecount = nbytes - i;
      if (bytecount > 16) bytecount = 16;
      fprintf(fp, "S3%02X%08lX", bytecount + 5, localaddress);
      sumcheck = bytecount + 5;
      for (j = 0; j < 3; j++)
         sumcheck += (localaddress >> (8 * j)) & 0xFF;
      for (j = 0; j < bytecount; j++) {
         fprintf(fp, "%02X", (int)(c = *ptr++));
         sumcheck += c;
      }
      fprintf(fp, "%02X\n", ~sumcheck & 0xFF);
      localaddress += bytecount;
   }
}

bei Antwort benachrichtigen
Andreas42 Nobody666 „Hilfe mit C-Programm“
Optionen

Hi!

Öh, schwierig... (und dabei bin ich kein C-Spezialist).

OK, langsam und von Vorne:

Übergeben wird eine Adresse und eine Byteanzahl.

Sinn ist eine Art Speicherdump Zeilenweise auszugeben.

Die Zeile beginnt mit "S3".
Dann folgt ein Byte, das die Länge der Zeile angiebt (im Beispiel $0A).
Nun folgt die übergebene Adresse, dargestellt durch 4 Bytes.
Diese 4 Bytes werden byteweise summert (die Adresse wird als Long interpretiert und Bitweise summiert).
In deinem Beisoiel ist die Adrsse $0000004B. Adiert wird $4B + $00 + $00 *$00
Das &0xFF ist die Maskierung als Byte. Mit >>(8*j) wird bitweise verschoben (im Beispiel zuerst (8*0, dann 8*1, dann 8*2, dann 8*3)

Ist die Angebene Bytesanzahl >0 gewesen, wird nun diese Anzahl an Bytes ab der angegebenen Speicheradresse ausgegeben. Der Wert des Bytes wird wieder auf die Prufsumme addiert. dabei wird der bereichnete Wert auf Byte maskiert (er wird daher nie >255).

Nun wird die Prüfsumme bitweise negiert, auf bytemaskiert und ausgebenen.

OK: letzte Besonderheit:

Die erste Vorschleife bewirkt, dass bei übergebenen nbytes > 16 das Ganze auf "Zeilen" mit max. 16 (Speicherdump)Bytes umgebrochen wird.

Ich hoffe, dass ich das nicht total falsch interpretiert habe. Die Bedeutung des Tile musste ich auch erst nachschlagen...

Ich hoffe, das war keine Hausaufgabe bzw. Hausarbeit...

Bis denn
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
Hilfe mit C-Programm Nobody666
Hilfe mit C-Programm Andreas42
Hilfe mit C-Programm Nobody666