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
Hilfe mit C-Programm Nobody666
Andreas42 Nobody666 „Hilfe mit C-Programm“
Optionen

Hi!

Schau nochmal in das "Original" in deinem Startbeitrag. Da wurde das gemacht:

fprintf(fp, "%02X\n", ~sumcheck & 0xFF);

Der Trick besteht darin, per Bitoperation, bei einem Intergerwert alle Bits auszublenden, die nicht zum Wertebereich passen. Das erfolgt hier mit & 0xFF.
Man kann das natürlich auch "zu Fuss" erledigen:

Prüffsumme nehmen, durch 256 teilen (Integerdivision = ohne Nachkommawert!). Das Ergebnis mal 256 nehmen und von der ursprünglichen Prüfsumme abziehen.
Der Rest liegt dann im Bereich 0 - 255.

Bis denn
Andreas

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