On-line CRC-berekening en vrije bibliotheek

geplaatst in: Articles | 0
  • inleiding op CRC-berekeningen
  • gratis CRC-berekeningsroutines voor download
Laden…

inleiding bij CRC-berekeningen

wanneer digitale gegevens worden opgeslagen of gekoppeld, kan datacorruptie optreden. Sinds het begin van de informatica, mensen hebben nagedacht over manieren om te gaan met dit soort problemen., Voor seriële gegevens kwamen ze met de oplossing om een pariteit bit te koppelen aan elke verzonden byte. Dit eenvoudige detectiemechanisme werkt als een oneven aantal bits in een byte verandert, maar een even aantal valse bits in een byte zal niet worden gedetecteerd door de pariteitscontrole. Om dit probleem op te lossen hebben mensen gezocht naar wiskundige geluidsmechanismen om meerdere valse bits te detecteren. De CRC-berekening of cyclische redundantiecontrole was het resultaat hiervan. Tegenwoordig worden CRC-berekeningen gebruikt in alle soorten communicatie. Alle pakketten die via een netwerkverbinding worden verzonden, worden gecontroleerd met een CRC., Ook elk gegevensblok op uw harde schijf heeft een CRC-waarde die eraan is gekoppeld. De moderne computerwereld kan niet zonder deze CRC-berekening. Laten we eens kijken waarom ze zo veel gebruikt worden. Het antwoord is eenvoudig, ze zijn krachtig, detecteren vele soorten fouten en zijn extreem snel te berekenen, vooral wanneer dedicated hardware chips worden gebruikt.

men zou kunnen denken, dat het gebruik van een checksum de juiste CRC berekeningen kan vervangen. Het is zeker makkelijker om een checksum te berekenen, maar checksums vinden niet alle fouten. Laten we een voorbeeld string nemen en een één byte checksum berekenen., De voorbeeld string is “Lammert” die converteert naar de ASCII waarden . De ene Byte checksum van deze array kan worden berekend door alle waarden op te tellen, dan te delen door 256 en de rest te behouden. De resulterende checksum is 210. U kunt de rekenmachine hierboven gebruiken om dit resultaat te controleren.

in dit voorbeeld hebben we een lange checksum van één byte gebruikt die ons 256 verschillende waarden geeft. Het gebruik van een twee byte checksum zal resulteren in 65.536 mogelijke verschillende checksum waarden en wanneer een vier byte waarde wordt gebruikt zijn er meer dan vier miljard mogelijke waarden., We zouden kunnen concluderen dat met een vier byte checksum de kans dat we per ongeluk geen fout ontdekken minder dan 1 tot 4 miljard is. Lijkt vrij goed, maar dit is slechts theorie. In de praktijk veranderen bits niet puur willekeurig tijdens communicatie. Ze falen vaak in uitbarstingen, of als gevolg van elektrische pieken. Laten we aannemen dat in onze voorbeeld array het laagste significante bit van het teken ‘L’ is ingesteld, en het laagste significante bit van teken ‘a’ verloren gaat tijdens de communicatie. De ontvanger zal dan de array zien die de string “M ‘ mmert”vertegenwoordigt., De checksum voor deze nieuwe string is nog steeds 210, maar het resultaat is duidelijk verkeerd, pas na twee bits veranderd. Zelfs als we een vier byte lange checksum hadden gebruikt zouden we deze transmissiefout niet hebben gedetecteerd. Het berekenen van een checksum kan dus een eenvoudige methode zijn om fouten op te sporen, maar geeft niet veel meer bescherming dan de pariteitsbit, onafhankelijk van de lengte van de checksum.

het idee achter een controlewaarde berekening is eenvoudig. Gebruik een functie F (bval, cval) die één data byte en een controlewaarde invoert en een herberekende controlewaarde uitvoert., In feite kunnen checksumberekeningen zoals hierboven beschreven op deze manier worden gedefinieerd. Onze één byte checksum voorbeeld zou kunnen zijn berekend met de volgende functie (in C taal) die we herhaaldelijk aanroepen voor elke byte in de input string. De beginwaarde voor cval is 0.

int F_chk_8( int bval, int cval ) { retun ( bval + cval ) % 256;}

het idee achter CRC-berekening is om de gegevens te bekijken als één groot binair getal. Dit getal wordt gedeeld door een bepaalde waarde en de rest van de berekening wordt de CRC genoemd., Delen in de CRC-berekening lijkt in eerste instantie veel rekenkracht te kosten, maar het kan heel snel worden uitgevoerd als we een methode gebruiken die vergelijkbaar is met de methode die op school is geleerd. We zullen als voorbeeld de rest voor het teken ‘m’—dat is 1101101 in binaire notatie—berekenen door het te delen door 19 of 10011. Houd er rekening mee dat 19 een oneven getal is. Dit is noodzakelijk, zoals we later zullen zien. Raadpleeg uw schoolboeken omdat de binaire berekeningsmethode hier niet erg verschilt van de decimale methode die u leerde toen u jong was. Het ziet er misschien een beetje vreemd uit., Ook notaties verschillen tussen landen, maar de methode is vergelijkbaar.

 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

met decimale berekeningen kunt u snel controleren of 109 gedeeld door 19 een quotiënt van 5 geeft met 14 als de rest. Maar wat we ook zien in het schema is dat elk beetje extra om te controleren kost slechts een binaire vergelijking en in 50% van de gevallen een binaire aftrekking., U kunt eenvoudig het aantal bits van de test data string verhogen – bijvoorbeeld tot 56 bits als we onze voorbeeldwaarde “Lammert”gebruiken—en het resultaat kan worden berekend met 56 binaire vergelijkingen en een gemiddelde van 28 binaire Aftrekken. Dit kan direct in hardware worden geïmplementeerd met slechts zeer weinig transistors. Ook softwarealgoritmen kunnen zeer efficiënt zijn.

voor CRC-berekeningen wordt geen normale aftrekking gebruikt, maar alle berekeningen worden gedaan modulo 2. In die situatie negeer je carry bits en in feite zal de aftrekking gelijk zijn aan een exclusieve OF operatie., Dit ziet er vreemd uit, de resulterende rest heeft een andere waarde, maar vanuit een algebraïsch oogpunt is de functionaliteit gelijk. Voor een bespreking hiervan zou universitaire kennis van de algebraïsche veldentheorie nodig zijn en ik denk dat de meeste lezers hier niet in geïnteresseerd zijn. Kijk aan het einde van dit document voor boeken die dit in detail bespreken.

nu hebben we een CRC berekeningsmethode die implementeerbaar is in zowel hardware als software en ook een meer willekeurig gevoel heeft dan het berekenen van een gewone checksum. Maar hoe zal het in de praktijk presteren als een of meer bits verkeerd zijn?, Als we de deler—19 in ons voorbeeld-kiezen om een oneven getal te zijn, heb je geen wiskunde op hoog niveau nodig om te zien dat elke bit fout wordt gedetecteerd. Dit komt omdat elke bit fout het dividend zal laten veranderen met een macht van 2. Als bijvoorbeeld bit n verandert van 0 naar 1, zal de waarde van het dividend toenemen met 2n. als bit n verandert van 1 naar 0, zal de waarde van het dividend afnemen met 2n. omdat je geen macht van twee kunt delen door een oneven getal, zal de rest van de CRC berekening veranderen en zal de fout niet onopgemerkt blijven.,

de tweede situatie die we willen detecteren is wanneer twee enkele bits in de gegevens veranderen. Dit vereist enige wiskunde die kan worden gelezen in Tanenbaum ‘ s boek hieronder vermeld. Je moet je deler zeer zorgvuldig selecteren om er zeker van te zijn dat onafhankelijk van de afstand tussen de twee verkeerde bits je ze altijd zult detecteren. Het is bekend, dat de veelgebruikte waarden 0x8005 en 0x1021 van de CRC16 en CRC-CCITT berekeningen presteren zeer goed op dit probleem., Houd er rekening mee dat andere waarden wel of niet kunnen, en je kunt niet gemakkelijk berekenen welke deler waarde geschikt is voor het detecteren van twee bit fouten en welke niet. vertrouw op uitgebreid wiskundig onderzoek over dit onderwerp dat enkele decennia geleden door hoogopgeleide wiskundigen is gedaan en gebruik de waarden die deze mensen verkregen.

verder willen we met onze CRC-berekening alle fouten detecteren waar een oneven aantal bits verandert. Dit kan worden bereikt door gebruik te maken van een deler met een even aantal bits set. Met modulo 2 mathematics kun je laten zien dat alle fouten met een oneven aantal bits worden gedetecteerd., Zoals ik al eerder heb gezegd, wordt in de Modulo 2 Wiskunde de aftrekkingsfunctie vervangen door de exclusieve or. Er zijn vier mogelijke XOR operaties.

0 XOR 0 => 0 even => even0 XOR 1 => 1 odd => odd1 XOR 0 => 1 odd => odd1 XOR 1 => 0 even => even

we zien dat Voor alle combinaties van bitwaarden de eigenaardigheid van de expressie hetzelfde blijft. Bij het kiezen van een deler met een even aantal bits set, de eigenaardigheid van de rest is gelijk aan de eigenaardigheid van het dividend. Daarom, als de eigenaardigheid van het dividend verandert omdat een oneven aantal bits verandert, zal de rest ook veranderen., Dus alle fouten die een oneven aantal bits veranderen zullen worden gedetecteerd door een CRC berekening die wordt uitgevoerd met een dergelijke deler. Je hebt misschien gezien dat de veelgebruikte delerwaarden 0x8005 en 0x1021 eigenlijk een oneven aantal bits hebben, en zelfs niet zoals hier vermeld. Dit komt omdat er binnen het algoritme een “verborgen” extra bit 216 is die de werkelijk gebruikte delerwaarde 0x18005 en 0x11021 binnen het algoritme maakt.,

Last but not least willen we alle burst-fouten detecteren met onze CRC-berekening met een maximale lengte die gedetecteerd moet worden, en alle langere burst-fouten met een hoge waarschijnlijkheid. Een burst fout is vrij gebruikelijk in communicatie. Het is het type fout dat optreedt als gevolg van bliksem, relais schakelen, enz. waarbij gedurende een kleine periode alle bits op één worden gezet., Om dit echt te begrijpen moet je ook enige kennis hebben van modulo 2 algebra, dus accepteer alsjeblieft dat je met een 16 bit deler in staat zult zijn om alle uitbarstingen met een maximale lengte van 16 bits te detecteren, en alle langere uitbarstingen met minstens 99,997% zekerheid.

in een zuiver wiskundige benadering wordt CRC-berekening afgeschreven als polynoomberekeningen. De delerwaarde wordt meestal niet beschreven als een binair getal, maar een veelterm van een bepaalde orde. In het normale leven worden sommige veeltermen vaker gebruikt dan andere., De drie gebruikt in de online CRC berekening op deze pagina zijn de 16 bit wide CRC16 en CRC-CCITT en de 32 bit wide CRC32. De laatste wordt waarschijnlijk het meest gebruikt nu, omdat onder andere het is de CRC generator voor alle netwerkverkeer verificatie en validatie.

voor alle drie de typen CRC-berekeningen heb ik een vrije softwarebibliotheek beschikbaar. Het testprogramma kan direct worden gebruikt om bestanden of strings te testen. U kunt ook kijken naar de broncodes en integreren deze CRC routines in uw eigen programma., Houd rekening met de initialisatiewaarden van de CRC-berekening en mogelijke noodzakelijke post-processing zoals flipping bits. Als u dit niet doet, kunt u andere resultaten krijgen dan andere CRC-implementaties. Al deze pre-en post-processing wordt gedaan in het voorbeeldprogramma, dus het zou niet zo moeilijk moeten zijn om je eigen implementatie te laten werken. Een veelgebruikte test is het berekenen van de CRC-waarde voor de ASCII-string “123456789”., Als het resultaat van uw routine overeenkomt met het resultaat van het testprogramma of het resultaat op deze website, werkt uw implementatie en is compatibel met de meeste andere implementaties.

als referentie de veeltermfuncties voor de meest voorkomende CRC-berekeningen. Vergeet niet dat de hoogste ordetermijn van de veelterm (x16 of x32) niet aanwezig is in de binaire getalrepresentatie, maar geïmpliceerd door het algoritme zelf.,

Literatuur
2002 Andrew S. Tanenbaum
various de kunst van computerprogrammeren is de belangrijkste referentie voor semi-numerieke algoritmen. Veeltermberekeningen worden uitvoerig beschreven. Een deel van de wiskunde is echter nodig om het volledig te begrijpen. Donald E. Knuth
DNP 3.,0, of distributed network protocol is een communicatieprotocol ontworpen voor gebruik tussen onderstation computers, RTUs remote terminal units, IED ‘ s intelligente elektronische apparaten en master stations voor de elektriciteitsindustrie. Het wordt nu ook gebruikt in bekende industrieën zoals afvalwaterbehandeling, transport en de olie-en gasindustrie. DNP User Group

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *