CRC (volt: TITKOSITAS - uC)

Palasik Sandor palasik at mail.datanet.hu
Fri Oct 22 12:06:48 CEST 2004


> void rotate_crc(int new_byte)
> {
>    int crc_temp;
>    int i;
>    for (i=8; i; i--)
>    {
>      crc_temp=crc; //crc_temp 0. bit = crc 0. bit
>      crc_temp^=new_byte; //crc_temp 0. bit XOR= new_byte 0. bit
>      #asm
>        rrf new_byte,F //rotate bejovo_adat
>      #endasm
>      if (bit_test(crc_temp,0)) //ha a visszacsatolando bit = 1
>      {
>        crc^=0x55; //a megforgatando bitek pl. 01010101
>      }
>      else //ha a visszacsatolando bit = 0
>      {
>        crc^=0xAA; //a megforgatando bitek pl. 10101010
>      }
>      #asm
>        bcf status,0 //carry = crc_temp.0
>        btfsc crc_temp,0
>        bsf status,0
>        rrf crc,F //rotate crc
>      #endasm
>    }
> }

Elismerem, hogy ez egy nagyon ravasz bitcsavaró program. Amit viszont én
tudok a CRC-ről: csak akkor kell XOR művelet, ha az MSB és a bejövő bit
különbözik, úgyhogy szerintem ez nem CRC.

Csináltam egy példaprogramot, abból, amit küldtél. Ciklus hossz alatt én azt
értem, hogy ha csupa nulla a bemenő adat, akkor hány bájtonként ismétlődik a
CRC értéke.
Az általad megadott 0x55 és 0xAA értékekkel ez vagy 2 vagy 8 byte. Ellenben
ha pl. a visszacsatolás értéke 0x1C, akkor ez a ciklushossz 254 byte,
kivéve, ha a CRC kezdőértéke 0. Én erről a visszacsatolás-függésről
beszéltem. Nagyon nem mindegy, hogy milyen CRC polinomot használsz.

Palasik Sándor

#include <stdio.h>
#include <stdlib.h>

int bit_test(int a,int b)
{
        return (a>>b)&1;
}

int crc,XOR1,XOR0;

void rotate_crc(int new_byte)
{
   int crc_temp;
   int i;
   for (i=8; i; i--)
   {
     crc_temp=crc; //crc_temp 0. bit = crc 0. bit
     crc_temp^=new_byte; //crc_temp 0. bit XOR= new_byte 0. bit

     new_byte >>= 1; // mivel a kicsorgo bitekre nem lesz szukseg,
     // nem kuzdok a rotalassal

     if (bit_test(crc_temp,0)) //ha a visszacsatolando bit = 1
     {
       crc^=XOR1; //a megforgatando bitek pl. 01010101
     }
     else //ha a visszacsatolando bit = 0
     {
       crc^=XOR0; //a megforgatando bitek pl. 10101010
     }

/*     #asm
       bcf status,0 //carry = crc_temp.0
       btfsc crc_temp,0
       bsf status,0
       rrf crc,F //rotate crc
     #endasm */

        crc = ((crc >> 1) & 0x7f) | ((crc_temp << 7) & 0x80);
   }
}

int main()
{
        int i,j,k;

        for (k=0; k<2; k++) {
                if (k == 0) {
                        XOR1=0x55;
                        XOR0=0xAA;
                        }
                else {
                        XOR1 = 0x1C;
                        XOR0 = 0;
                        }

                printf("=============================\n"
                        "XOR1: %02X, XOR0: %02X\n",XOR1,XOR0);

                for (i=0; i<256; i++) {
                        crc = i;

                        for (j=0; j<256; j++) {
                                rotate_crc(0);

                                if (crc == i)
                                        break;
                                }

                        printf("CRC: %02X, ciklus: %d\n",i,j);
                        }
                }

        return 0;
}




More information about the Elektro mailing list