- Introduktion på CRC beregninger
- Gratis CRC-beregning rutiner for download
forord den CRC beregninger
Når digitale data, der er gemt eller grænseflader, data korruption kan forekomme. Siden begyndelsen af datalogi har folk tænkt på måder at håndtere denne type problemer på., For serielle data kom de med løsningen til at vedhæfte en paritetsbit til hver sendt byte. Denne enkle detektionsmekanisme fungerer, hvis et ulige antal bits i en byte ændres, men et lige antal falske bits i en byte vil ikke blive detekteret ved paritetskontrollen. For at overvinde dette problem har folk søgt efter matematiske lydmekanismer til at opdage flere falske bits. CRC-beregningen eller cyklisk redundanskontrol var resultatet af dette. I dag bruges CRC-beregninger i alle typer kommunikation. Alle pakker, der sendes via en netværksforbindelse, kontrolleres med en CRC., Også hver datablok på din harddisk har en CRC-værdi knyttet til den. Den moderne computerverden kan ikke undvære denne CRC-beregning. Så lad os se, hvorfor de er så udbredt. Svaret er enkelt, de er kraftfulde, registrerer mange typer fejl og er ekstremt hurtige at beregne, især når dedikerede hard .arechips bruges.
man kunne tro, at ved hjælp af en checksum kan erstatte ordentlig CRC beregninger. Det er bestemt lettere at beregne et checksum, men checksums finder ikke alle fejl. Lad os tage et eksempel streng og beregne en en byte checksum., Eksempelstrengen er “Lammert”, som konverterer til ASCII-værdierne . Den ene byte checksum af dette array kan beregnes ved at tilføje alle værdier, end at dividere det med 256 og holde resten. Den resulterende checksum er 210. Du kan bruge lommeregneren ovenfor til at kontrollere dette resultat.
i dette eksempel har vi brugt en en byte lang checksum, som giver os 256 forskellige værdier. Ved hjælp af en to byte checksum vil resultere i 65,536 mulige forskellige checksum værdier og når en fire byte værdi anvendes der er mere end fire milliarder mulige værdier., Vi kan konkludere, at med en fire byte checksum er chancen for, at vi ved et uheld ikke opdager en fejl, mindre end 1 til 4 milliarder. Synes ret godt, men det er kun teori. I praksis ændrer bits ikke rent tilfældigt under kommunikation. De fejler ofte i udbrud eller på grund af elektriske pigge. Lad os antage, at i vores eksempel array er den laveste signifikante bit af tegnet ‘L’ indstillet, og den laveste signifikante bit af tegn ‘a’ går tabt under kommunikation. Modtageren vil End se arrayet, der repræsenterer strengen”m ‘ mert”., Checksummen for denne nye streng er stadig 210, men resultatet er åbenlyst forkert, først efter at to bits er ændret. Selv hvis vi havde brugt en fire byte lang checksum, ville vi ikke have opdaget denne transmissionsfejl. Så beregning af en checksum kan være en simpel metode til at opdage fejl, men giver ikke meget mere beskyttelse end paritetsbiten, uafhængig af længden af checksummen.
ideen bag en check værdi beregning er enkel. Brug en funktion f (bval, cval), der indtaster en data byte og en check værdi og udsender en genberegnet check værdi., Faktisk checksum beregninger som beskrevet ovenfor kan defineres på denne måde. Vores ene byte checksum eksempel kunne have været beregnet med følgende funktion (i C-sprog), som vi kalder gentagne gange for hver byte i input strengen. Den oprindelige værdi for cval er 0.
int F_chk_8( int bval, int cval ) { retun ( bval + cval ) % 256;}
ideen bag CRC-beregningen er at se på dataene som et stort binært tal. Dette tal er divideret med en bestemt værdi, og resten af beregningen kaldes CRC., Opdeling i CRC-beregningen ser først ud til at koste en masse computerkraft, men det kan udføres meget hurtigt, hvis vi bruger en metode, der ligner den, der læres i skolen. Vi vil som eksempel beregne resten for tegnet ‘ m ‘ —som er 1101101 i binær notation-ved at dividere det med 19 eller 10011. Bemærk venligst, at 19 er et ulige tal. Dette er nødvendigt, som vi vil se yderligere på. Se venligst dine skolebøger, da den binære beregningsmetode her ikke er meget forskellig fra den decimalmetode, du lærte, da du var ung. Det ser måske kun lidt underligt ud., Også notationer varierer mellem lande, men metoden er ens.
1 0 1 = 5 -------------1 0 0 1 1 / 1 1 0 1 1 0 1 1 0 0 1 1 | | --------- | | 1 0 0 0 0 | 0 0 0 0 0 | --------- | 1 0 0 0 0 1 1 0 0 1 1 --------- 1 1 1 0 = 14 = remainder
Med decimal beregninger, du kan hurtigt tjekke, at 109 divideret med 19 giver en kvotient af 5 med 14 som den resterende del. Men hvad vi også ser i ordningen er, at hver bit ekstra for at kontrollere kun koster en binær sammenligning og i 50% af tilfældene en binær subtraktion., Du kan nemt øge antallet af bits i testdatastrengen—for eksempel til 56 bit, hvis vi bruger vores eksempelværdi “Lammert”—og resultatet kan beregnes med 56 binære sammenligninger og i gennemsnit 28 binære subtraktioner. Dette kan implementeres i Hard .are direkte med kun meget få transistorer involveret. Også soft .are algoritmer kan være meget effektive.
til CRC-beregninger anvendes ingen normal subtraktion, men alle beregninger udføres modulo 2. I den situation ignorerer du carry bits og i virkeligheden vil subtraktionen være lig med en eksklusiv eller operation., Dette ser mærkeligt ud, den resulterende rest har en anden værdi, men fra et algebraisk synspunkt er funktionaliteten ens. En diskussion af dette ville have brug for universitetsniveau viden om algebraisk feltteori, og jeg antager, at de fleste læsere ikke er interesseret i dette. Se i slutningen af dette dokument for bøger, der diskuterer dette i detaljer.
nu har vi en CRC-beregningsmetode, der kan implementeres i både hard .are og soft .are og også har en mere tilfældig følelse end at beregne et almindeligt checksum. Men hvordan vil det udføre i praksis, når en malm flere bits er forkert?, Hvis vi vælger divisoren—19 i vores eksempel—for at være et ulige tal, behøver du ikke matematik på højt niveau for at se, at hver enkelt bit-fejl vil blive opdaget. Dette skyldes, at hver enkelt bit fejl vil lade udbyttet ændre sig med en effekt på 2. Hvis du for eksempel smule n ændres fra 0 til 1, værdien af udbyttet vil stige med 2n. Hvis på den anden side smule n ændringer fra 1 til 0, værdien af udbyttet vil falde med 2n. Fordi du kan ikke opdele en potens af to ved et ulige antal, er den resterende del af CRC-beregning vil ændre sig, og den fejl vil ikke gå ubemærket hen.,
den anden situation, vi vil opdage, er, når to enkeltbits ændres i dataene. Dette kræver nogle matematik, som kan læses i Tanenbaum bog nævnt nedenfor. Du skal vælge din divisor meget omhyggeligt for at være sikker på, at du altid vil registrere dem uafhængigt af afstanden mellem de to forkerte bits. Det er kendt, at de almindeligt anvendte værdier 0x8005 og 0x1021 af CRC16 og CRC-CCITT beregninger udføre meget godt på dette spørgsmål., Bemærk, at andre værdier, måske, eller måske ikke, og du kan ikke nemt at beregne, hvor divisor værdi, der er egnede til at afsløre to smule fejl, og som ikke er. Basere sig på en omfattende matematisk forskning på dette spørgsmål gjort nogle årtier siden af dygtige matematikere og bruge de værdier, disse mennesker opnået.
desuden vil vi med vores CRC-beregning registrere alle fejl, hvor et ulige antal bit ændres. Dette kan opnås ved at bruge en divisor med et lige antal bits indstillet. Ved hjælp af Modulo 2 matematik kan du vise, at alle fejl med et ulige antal bits registreres., Som jeg har sagt før, i modulo 2 matematik subtraktion funktion er erstattet af den eksklusive eller. Der er fire mulige operationsor operationer.
0 XOR 0 => 0 even => even0 XOR 1 => 1 odd => odd1 XOR 0 => 1 odd => odd1 XOR 1 => 0 even => even
Vi se, at der for alle kombinationer af bit værdier, oddness af udtrykket forbliver den samme. Når du vælger en divisor med et lige antal bits, er resten af resten lig med udbyttet af udbyttet. Derfor, hvis udbyttets oddness ændres, fordi et ulige antal bits ændres, vil resten også ændre sig., Så alle fejl, der ændrer et ulige antal bits, registreres ved en CRC-beregning, der udføres med en sådan divisor. Du har måske set, at de almindeligt anvendte divisor værdier 0x8005 og 0x1021 faktisk har et ulige antal bits, og ikke engang som her anført. Dette skyldes, at der inden i algoritmen er en “skjult” ekstra bit 216, der gør den faktiske anvendte divisorværdi 0 .18005 og 0 .11021 inde i algoritmen.,
Sidst men ikke mindst ønsker vi at registrere alle burstfejl med vores CRC-beregning med en maksimal længde, der skal opdages, og alle længere burstfejl, der skal opdages med stor sandsynlighed. En burst-fejl er ret almindelig i kommunikation. Det er den type fejl, der opstår på grund af lynnedslag, relæskift osv. hvor i løbet af en lille periode er alle bits sat til en., For virkelig at forstå dette, er du også nødt til at have en vis viden om modulo-2 algebra, så skal du acceptere, at med en 16 bit divisor du vil være i stand til at opdage alle bursts med en maksimal længde på 16 bits, og alle længere byger med mindst 99.997% sikkerhed.
i en ren matematisk tilgang skrives CRC-beregning ned som polynomberegninger. Divisorværdien beskrives oftest ikke som et binært tal, men et polynom af en bestemt rækkefølge. I det normale liv bruges nogle polynomier oftere end andre., De tre, der bruges i online CRC-beregningen på denne side, er 16 bit wideide CRC16 og CRC-CCITT og 32 bits wideide CRC32. Sidstnævnte bruges sandsynligvis mest nu, fordi det blandt andet er CRC-generatoren til al verifikation og validering af netværkstrafik.
for alle tre typer CRC-beregninger har jeg et gratis Soft .are-bibliotek tilgængeligt. Testprogrammet kan bruges direkte til at teste filer eller strenge. Du kan også se på kildekoderne og integrere disse CRC-rutiner i dit eget program., Vær opmærksom på initialiseringsværdierne for CRC-beregningen og mulig nødvendig efterbehandling som flipping bits. Hvis du ikke gør dette, kan du få forskellige resultater end andre CRC implementeringer. Alt dette før og efterbehandling sker i eksempelprogrammet, så det skal ikke være svært at få din egen implementering til at fungere. En almindelig brugt test er at beregne CRC-værdien for ASCII-strengen “123456789”., Hvis resultatet af din rutine matcher resultatet af testprogrammet eller resultatet på dette websiteebsted, din implementering fungerer og er kompatibel med de fleste andre implementeringer.
ligesom en reference de polynomielle funktioner for de mest almindelige CRC beregninger. Husk, at den højeste ordens sigt af polynomet (1616 eller3232) ikke er til stede i det binære tal repræsentation, men underforstået af algoritmen selv.,
Litteratur | ||
2002 | Computer-Netværk, der beskriver fælles netværk systemer, og teori og algoritmer bag deres gennemførelse. | andre.S. Tanenbaum |
kunsten at computerprogrammering er den vigtigste reference for semi-numeriske algoritmer. Polynomiale beregninger er beskrevet i dybden. Et vist niveau af matematik er nødvendigt for fuldt ud at forstå det selv. | Donald E. Knuth | |
– | DNP 3.,0, eller distribueret netværksprotokol er en kommunikationsprotokol designet til brug mellem substationscomputere, rtus-fjernterminaler, IEDs intelligente elektroniske enheder og masterstationer til den elektriske forsyningsindustri. Det bruges nu også i velkendte industrier som spildevandsrensning, transport og olie-og gasindustrien. | DNP-Bruger-Gruppen |
Skriv et svar