Programmieren - alles kontrollieren 4.935 Themen, 20.621 Beiträge

c-programm- crc32 berechnung von manufacturing infos

Nobody666 / 10 Antworten / Flachansicht Nickles

Hilfe!!! Anbei hab ich ein C-Programm, welches von manufacturing daten die checksumme in crc32 berechnen soll.


1. kann mir jemand sagen was:


 *((u32 *)&Manufactureing_Info [MANUFACTURING_INFO_SIZE -4]) = chksum bedeuten soll?


2. beim ausführen kommt Fehlermeldung:


 undefined reference to `util_gen_crc'


3. wo und wie übergebe ich die daten?


 


Vielen Dank schon mal im voraus!!!!!!!


 


#include <stdio.h>
#include <math.h>
typedef unsigned long u32;
#define MANUFACTURING_INFO_SIZE 140
#define CRC32_POLYNOMIAL 0xEDB88320


char Manufactureing_Info [MANUFACTURING_INFO_SIZE] = "43";



int main ()
{
 u32 chksum;
 chksum = ~ util_gen_crc (Manufactureing_Info, MANUFACTURING_INFO_SIZE -4, 0xffffffff);
 *((u32 *)&Manufactureing_Info [MANUFACTURING_INFO_SIZE -4]) = chksum;
 printf("Die checksumme ist: %08lx",chksum);
}
u32 util_gen_crc (char *pcDatabuf, u32 ulDatalen, u32 ulCrc_in)
{
 u32 idx, bit, data, crc;
 crc = ulCrc_in;
 for (idx = 0; idx < ulDatalen; idx++)
 {
  data = *pcDatabuf++;
  for (bit = 0; bit < 8; bit++, data >>=1)
  {
   crc = (crc >> 1) ^ (((crc ^ data) & 1) ? CRC32_POLYNOMIAL : 0);
  }
 }
 return crc;
}

bei Antwort benachrichtigen
mr.escape Nobody666 „Also, hab mich nochmal damit beschäftigt, hab jetzt folgende Lösung,...“
Optionen
Also, hab mich nochmal damit beschäftigt, hab jetzt folgende Lösung, funktioniert leider nicht:
Meine antwort lautet so (kommentare mit //### sind von mir, bedingtes compilieren mit alternative):

#include
typedef unsigned long u32;
#define MANUFACTURING_INFO_SIZE 140 //komplettes Feld incl. chksum
#define CRC32_POLYNOMIAL 0xEDB88320
char Manufactureing_Info [MANUFACTURING_INFO_SIZE];
u32 util_gen_crc (char *pcDatabuf, u32 ulDatalen, u32 ulCrc_in);

int main (){
  FILE *werte;
  char Infos_ohne_Mac [MANUFACTURING_INFO_SIZE];

  //### warum als "r" und nicht als "rb"?
  if ( (werte = fopen("M:\\1409101.lb0","r"))==NULL) //Pointer auf Datei wird in werte gespeichert
  {
    printf("error opening file M:\\1409101.lb0\n");
    exit(0);
  } else {
#if 1
    fseek(werte, 116, SEEK_SET);//überspringen von 116 bytes
    fread(Infos_ohne_Mac, 1, MANUFACTURING_INFO_SIZE, werte);//einlesen von MANUFACTURING_INFO_SIZE bytes
    //### unten fehler, da ab index 1 gelesen wird, d.h. erstes char undefiniert und ein extra char wird überschrieben!!!
    //### in c/c++ beginnen arrays bei 0 und nicht bei 1!, also müsste es heissen:
    //### for (int i=0; i<MANUFACTURING_INFO_SIZE; i++){
    //### Infos_ohne_Mac [i] = getc(werte);
    //### }
    //### die letzten vier bytes werden dabei auch nicht gebraucht (nicht in crc und später überschrieben)
#else
    for (int i=1; i<=116; i++) { //überlesen der ersten 116 Zeichen, dürfen nicht in Berechnung eingehen
      getc(werte);
    } //verlassen for-Schleife

    for (int i=1; i<=MANUFACTURING_INFO_SIZE; i++)
    {
      Infos_ohne_Mac [i] = getc(werte); //Einlesen und speichern in Infos_ohne_Mac der relevanten Daten für Berechnung

    }
#endif

  } //verlassen if-Schleife
  fclose(werte); //Datei schließen

  //### was soll das zweite, aus der datei gelesene byte aussagen? Und warum als %c und nicht als %02X?
  printf("Der 2. Wert ist: %c\n",Infos_ohne_Mac[2]); //Darstellung der Checksumme im Ascii Test!!wird später gelöscht


  u32 chksum;
  chksum = ~ util_gen_crc (Infos_ohne_Mac, MANUFACTURING_INFO_SIZE -4, 0xffffffff); //checksumme berechnen

  /*der errechnete crc wert wird in die letzten 4 bytes des char arrays gespeichert (chksum):*/
  *((u32 *)&Infos_ohne_Mac [MANUFACTURING_INFO_SIZE -4]) = chksum;




  printf("Die checksumme ist: %08lx",chksum); //Test!!(wird später entfernt)

}

/* ***************************** ende main ******************************************************************* */


//Funktion, die CRC 32 Wert berechnet. Ist vorgegeben, darf nicht verändert werden!

u32 util_gen_crc (char *pcDatabuf, u32 ulDatalen, u32 ulCrc_in)
{
  u32 idx, bit, data, crc;
  crc = ulCrc_in;
  for (idx = 0; idx < ulDatalen; idx++)
  {
    data = *pcDatabuf++;
    for (bit = 0; bit < 8; bit++, data >>=1)
    {
      crc = (crc >> 1) ^ (((crc ^ data) & 1) ? CRC32_POLYNOMIAL : 0);
    }
  }
  return crc;
}

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen