Avatar billede rantzausgade7 Nybegynder
10. december 2002 - 09:49 Der er 4 kommentarer og
1 løsning

Fejl i checksumsberegning

Hej eksperter!

Jeg har et problem med en CRC16-checksums algoritme. Problemet er, jeg ikke får den samme checksum, når jeg kalder algoritmen flere gange efter hinanden i min main! - derimod giver den nøjagtig det samme resultat når jeg looper min main! Hvad gør jeg galt?
Algoritmen, har jeg fundet på nettet, og er derfor ikke 100% klar over, hvordan den egentlig beregner checksummen. Den ser således ud:

unsigned CRC;
unsigned crc_16(char c)
{
  int i,j,CRC;
  for(i=0;i!=8;c>>=1,i++)
  {
      j=(c^CRC)&1;
      CRC>>=1;

      if(j)
        CRC^=0xa001;
  }
  printf("Checksum: %d \n", CRC);
  return CRC;
}

Min main ser således ud:

int main(void){
  char payload = 'b';
  crc_16(payload);
  crc_16(payload);
  crc_16(payload);
  crc_16(payload);
  return 0;
}

- hvor hver af de 4 kald giver et forskelligt resultat!
Håber I kan hjælpe - eller evt. henvise til en anden funktionel CRC16 algoritme..

På forhånd tak!
Avatar billede chries Nybegynder
10. december 2002 - 09:52 #1
din CRC var er ikke initialiseret:

int i,j,CRC;<- KAZING
  for(i=0;i!=8;c>>=1,i++)
  {
      j=(c^CRC)&1; <- KAZING
Avatar billede chries Nybegynder
10. december 2002 - 09:54 #2
Avatar billede rantzausgade7 Nybegynder
10. december 2002 - 10:01 #3
Du har ret!!! - stupid me, det burde jeg have set...
Men chries, så forholder det sig sådan, at jeg har haft præcis det samme problem med en anden CRC16! - jeg har nu kigget koden igennem efter steder, hvor jeg burde initialisere min variable, men kan ikke se fejlen! - kan du evt. hjælpe?

Koden ser således ud:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "headere.h"

int getChecksum(struct standardheader* pakke){
  char up,low;
  char result[2];
  int tempchecksum=pakke->checksum; //gemmer den gamle checksum
  char buf[65000];

  pakke->checksum=0;
 
  memcpy(buf, pakke, sizeof(struct standardheader));
  memcpy(buf+sizeof(struct standardheader), pakke->payload, pakke->payloadlaengde);
 
  beregnChecksum(buf,sizeof(struct standardheader)+pakke->payloadlaengde, &up, &low);



  result[0]=low;
  result[1]=up;
  pakke->checksum=tempchecksum;
  return *((int*)result);
}



//*************************************************************
//Konstruerer en CRC lookup tabel
//*************************************************************
  int    crctab[] =    /* CRC lookup table */
{
0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
};


//*************************************************************************
int beregnChecksum(char *buf, int len ,char *crc1, char *crc2)
// Udregner CRC16 på en given buffer
// Input :
// *buf : Pointer til en char buffer som der skal udregnes cheksum på
// len  : Antal chars i buf
// Output:
// crc1 : Her retuneres mest betydende byte af den udregnede crc
// crc2 : Her retuneres mindst betydende byte af den udregnede crc
//*************************************************************************   
{
    int    i,crc;
   
    for (i=0; i<len; i++)
        crc = ((crc >> 8) & 0xff) ^ crctab[(crc ^ *buf++) & 0xff];

    //opdel 16 bit crc i 2 bytes
    *crc1 = crc / 256;
    *crc2 = crc % 256;
    return 0;
}


/*kun til test
**************
*int main (void){
* char buffer[100];
* int resultat,i;
* struct standardheader header;
* header.version=1;
* header.pakketype=1;
* header.kvitteret=1;
* header.krypteret=2;
* header.dataid=1;
* header.checksum=0;
* header.payloadlaengde=10;
* header.fragmentnummer=1;
* header.timestamp=1000;
* header.totalstoerrelse=500;
* header.payload=malloc(10);
* strcpy(header.payload,"hjghygtdf");
* memcpy(buffer,(char*)&header,sizeof(struct standardheader));
* memcpy(buffer+sizeof(struct standardheader),header.payload,header.payloadlaengde);
* resultat=getChecksum((struct standardheader*)buffer);

*  printf("resultat: %d \n", resultat);
*return 0;
* }
*/

Ellers tusind tak for hjælpen....
Avatar billede chries Nybegynder
10. december 2002 - 10:05 #4
her er en fejl
her mangler initialisering:
{
    int    i,crc; <- (crc)
   
    for (i=0; i<len; i++)
        crc = ((crc >> 8) & 0xff) ^ crctab[(crc ^ *buf++) & 0xff]; <- (crc>>8
Avatar billede rantzausgade7 Nybegynder
10. december 2002 - 10:13 #5
Nu virker skidtet! - SUPER!!! Vi takker ydmygt... Du har ærligt fortjent point! :o) Kigger på dit link senere....
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