Amilyen egyszerű kiszámítani az ellenőrző CRC (crc32 - CRC16 - crc8) - Szoftver

Először is, nézzük megérteni egy kis elmélet. Szóval, mi a CRC? Röviden, ez az egyik fajta kiszámításának ellenőrző. Ellenőrző - módszer sértetlenségének ellenőrzése a kapott információt a fogadó oldalán az átviteli kommunikációs csatornákon keresztül. Például, az egyik legegyszerűbb tesztek - használata paritásbit. Ez adva minden bit a továbbított üzenet, és ha az összeg páros, akkor hozzáadjuk az üzenet 0, ha páratlan - 1. A fogadás összegeként kiszámított üzenet bitek és összehasonlítjuk a kapott paritás bit. Ha ezek különbözőek, akkor az átviteli hibák fordulnak elő, és a továbbított információt nem torzul.

De ez a módszer jelenlétének meghatározására hibákat - nagyon nem informatív, és nem mindig működik, mert a torzítás a pár hozzászólás bit, paritás az összeg nem lehet változtatni. Ezért sok „fejlettebb” vizsgálatok, beleértve a CRC.

Tény, hogy a CRC - ez nem az összeg, és az eredmény felosztásának egy bizonyos mennyiségű információ (adat üzenet) állandó - vagy inkább a maradék osztály üzenete állandó. Azonban CRC történelmileg is az úgynevezett „ellenőrző”. A CRC érték hozzájárul minden kis üzenet. Azaz, ha legalább egy kicsit az eredeti üzenet megváltozott a szállítás, az ellenőrző is meg fog változni, és jelentősen. Ez egy nagy plusz ezt a tesztet, mivel lehetővé teszi, hogy egyedi azonosítására torz az eredeti üzenetet, ha elküldi, vagy sem.

Mielőtt a számítás a CRC, szüksége lesz egy kicsit több elmélet.
Mi az eredeti üzenetet tisztának kell lennie. Ez egy folyamatos bitszekvencia tetszőleges hosszúságú.

Milyen állandó, amit meg kell osztani az eredeti üzenetet? Ez is egy szám bármilyen hosszúságú, de jellemzően használt többszörösei 1 bájt - 8, 16 és 32 bit. Csak így könnyebb azt hinni, mert a számítógépek dolgozni bájt helyett bit.

A konstans-elválasztó általában írva, mint egy polinom (polinom) így: x ^ 8 + x ^ 2 + x ^ 1 + x ^ 0. Itt, a mértéke „X” azt jelenti, a helyzet a bit egységek száma, kezdve nulla, és a MSB fokát jelzi a polinom elöntjük, és az értelmezése a számot. Ez azt jelenti, a korábban felvett számot - ez nem más, mint egy (1) 00000111 bináris jelölés vagy decimális 7. Zárójelben, már burkolt MSB számát.
Itt egy példa: x ^ 16 + x ^ 15 + x ^ 2 + x ^ = 0 (1) 1000000000000101 „= 0x8005 = 32773.
egyes általános polinomok gyakran használják a különböző típusú CRC.

Szóval hogyan lehet vizsgálni az ellenőrző? Van egy alapvető módszer - a szétválás üzenete polinom „egy homlok” - és annak módosítását annak érdekében, hogy csökkentse a számítás, és így felgyorsítja a CRC számítás. Úgy véljük, hogy egy alapvető módszer.

Általánosságban elmondható, hogy a körzet egy polinom végzünk ilyen algoritmus:
1) létrehoz egy tömböt (regisztrálja) nullákkal töltjük fel egyenlő a bit hosszúsága a polinom;
2) az eredeti üzenetre van nullákkal töltődik az alsó biteket, megfelelő mennyiségben, hogy a bitek száma a polinom;
3) az alacsony nyilvántartásban szerepel egy számjegyű MSB üzeneteket, és kiterjeszti a régebbi egybites regiszter szakaszban;
4) ha a kiterjesztett bit „1”, a bit inverzió végezzük (XOR művelet, XOR) a bitek a nyilvántartások, amelyek megfelelnek az egységek a polinom;
5) Ha az üzenet több bit, ugorjon a 3. lépésre);
6) ha az összes üzenetet bit kapott az ügyben, és már feldolgozott ezt az algoritmust, a nyilvántartás továbbra is fennmaradó részlege, amely egy ellenőrző CRC.

Az ábra illusztrálja a szétválás az eredeti szekvencia a bitek száma (1) 00000111, vagy polinom-x ^ 8 + x ^ 2 + x ^ 1 + x ^ 0.

Amilyen egyszerű kiszámítani az ellenőrző CRC (crc32 - CRC16 - crc8) - Szoftver

Laktam egy pár extra érinti. Mint látható, az üzenet lehet osztani minden számot. Hogyan választja meg? Számos szabványos polinomok, amelyek kiszámítására használt CRC. Például, a CRC32 az lehet a számot 0x04C11DB7, és ez lehet CRC16 0x8005.
Ezen túlmenően, abban az esetben az elején a számítások felírható nem nulla, hanem egy másik számot.

Szintén a számítások közvetlenül megelőzően a kiadását a végső CRC osztható más számot.

És az utolsó. Üzenet byte rögzítésére a nyilvántartásban hozható a legjelentősebb kicsit „előre”, és fordítva, a junior.

Mindezek alapján a fenti. írjunk egy függvényt nyelvén Basic .NET, ami kiszámítja az ellenőrző összeget a CRC, figyelembe számos paraméter, amit a fent leírt, és a visszatérő a CRC értéket, mint a 32 bites előjel nélküli számok.

Nyilvános osztott funkciójuk GetCrc (ByVal bájt, mint Byte (), ByVal poli Amint UInteger, Opcionális ByVal szélessége As Integer = 32, Opcionális ByVal initReg Amint UInteger = HFFFFFFFFUI, Opcionális ByVal finalXor Ahogy UInteger = HFFFFFFFFUI, Opcionális ByVal reverseBytes néven logikai = True, opcionális ByVal reverseCrc néven logikai = True) Ami UInteger

Dim widthInBytes As Integer = szélesség \ 8

„Befejezési az üzenet szélesség nullát (számítást bájt):
ReDim megőrzése bájt (bytes.Length - 1 + widthInBytes)

„Create összes bit az üzenet:
Dim msgFifo As New Queue (Boole) (bytes.Count * 8-1)
For Each B bájt bájt
Dim ba As New BitArray ()
Ha reverseBytes Aztán
Az i As Integer = 0-tól 7
msgFifo.Enqueue (BA (i))
következő
más
Az i As Integer = 7 0 lépés -1
msgFifo.Enqueue (BA (i))
következő
End If
következő

„Create minden bit a kezdeti töltési regiszter:
Dim initBytes Ahogy Byte () = BitConverter.GetBytes (initReg)
Dim initBytesReversed Ahogy IEnumerable (bájt) = (a B néven byte initBytes Vegye widthInBytes) .Reverse
Dim initFifo As New Queue (Boole) (szélesség - 1)
For Each B bájt initBytesReversed
Dim ba As New BitArray ()
Ha nem reverseBytes Aztán
Az i As Integer = 0-tól 7
initFifo.Enqueue (BA (i))
következő
más
Az i As Integer = 7 0 lépés -1
initFifo.Enqueue (BA (i))
következő
End If
következő

„Shift és XOR:
Dim regisztrálás UInteger = 0 „töltse ki a szélesség-bites regiszter nullákkal.
Do While msgFifo.Count> 0

Dim poppedBit As Integer = CInt (regisztrációhoz >> (szélesség - 1)) és 1 „, hogy meghatározzák a léptető regiszter.

Dim shiftedBit Ahogy Byte = Convert.ToByte (msgFifo.Dequeue)
Ha initFifo.Count> 0 Then
Dim B Mint Byte = Convert.ToByte (initFifo.Dequeue)
shiftedBit = shiftedBit Xor b
End If

REGISTER = <<1
Register = Regisztráció Vagy shiftedBit

Ha poppedBit = 1, akkor
REGISTER = Xor poli
End If
hurok

„Végső átalakulása:
Dim CRC UInteger = regisztrálja „regiszter tartalmazza a maradék Division == ellenőrző összeg.
Ha reverseCrc Aztán
CRC = tükrözik (CRC, szélesség)
End If
CRC = CRC Xor finalXor
CRC = CRC és az (HFFFFFFFFUI >> (32 - szélesség)) „elfedik a LSB.