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 „Hallo, erstmal danke für die schnelle Antwort. Ist keine Hausaufgabe, will ein...“
Optionen

Hi!

Ich hab' verstanden worum es geht.

Mein Vorschlag: vergiss die vorhandene Routine.

Dieses kompakte C-Gequäle macht es IMHO nur unötig schwer.

Ich würde da so rangehen:

Bau einen Strinf auf, der deine Zeile enthält (bis auf die Prüfsumme am Schluss).
Deine "Dezimalzahl" würde ich dabei ebenfalls als Hex-Wert ausgeben und dann die Bytewerte "drehen" (bzw. die Zifferpaare entsprechend tauschen - als Stringmanipulation ist das ja kein Problem).

Falls nötig, hier der Hinweis auf sprintf() für die Ausgabe "in einen String".

Die Prüfsumme berechnest du dann aus dem String, indem jeweils zwei Ziffern wieder in einen Bytewert umgrechnet werden und dann addiert werden (-> sscanf()).

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