Sa E Lehtë është Llogaritja E Shumës Së Kontrollit CRC (CRC32 - CRC16 - CRC8)

Përmbajtje:

Sa E Lehtë është Llogaritja E Shumës Së Kontrollit CRC (CRC32 - CRC16 - CRC8)
Sa E Lehtë është Llogaritja E Shumës Së Kontrollit CRC (CRC32 - CRC16 - CRC8)

Video: Sa E Lehtë është Llogaritja E Shumës Së Kontrollit CRC (CRC32 - CRC16 - CRC8)

Video: Sa E Lehtë është Llogaritja E Shumës Së Kontrollit CRC (CRC32 - CRC16 - CRC8)
Video: Контрольная сумма crc + modbus rtu 2024, Nëntor
Anonim

Ka shumë mundësi për llogaritjen e shumës së kontrollit CRC në internet. Por çfarë është saktësisht një kontroll kontrolli dhe pse llogaritet në këtë mënyrë? Le ta kuptojmë.

Sa e lehtë është llogaritja e shumës së kontrollit CRC (CRC32 - CRC16 - CRC8)
Sa e lehtë është llogaritja e shumës së kontrollit CRC (CRC32 - CRC16 - CRC8)

Udhëzimet

Hapi 1

Së pari, le të marrim pak teori. Pra, çfarë është saktësisht CRC? Me pak fjalë, kjo është një nga varietetet e llogaritjes së shumës së kontrollit. Checksum është një metodë për të kontrolluar integritetin e informacionit të marrë nga ana e marrësit kur transmeton përmes kanaleve të komunikimit. Për shembull, një nga kontrollet më të thjeshta është përdorimi i bitit të paritetit. Kjo është kur të gjitha bitët e mesazhit të transmetuar përmblidhen, dhe nëse shuma rezulton të jetë çift, atëherë 0 shtohet në fund të mesazhit, nëse është tek, atëherë 1. Kur merr, shuma e Bitet e mesazheve gjithashtu numërohen dhe krahasohen me bitin e marrë të paritetit. Nëse ato ndryshojnë, atëherë gabimet ndodhën gjatë transmetimit dhe informacioni i transmetuar ishte shtrembëruar.

Por kjo metodë e zbulimit të pranisë së gabimeve është shumë joinformative dhe nuk funksionon gjithmonë, sepse nëse disa bit të mesazhit janë të shtrembëruar, barazia e shumës mund të mos ndryshojë. Prandaj, ka shumë kontrolle më të "avancuara", përfshirë CRC.

Në fakt, CRC nuk është një shumë, por rezultat i ndarjes së një sasie të caktuar informacioni (mesazh informacioni) nga një konstante, ose më mirë, pjesa e mbetur e ndarjes së një mesazhi nga një konstante. Sidoqoftë, CRC është referuar historikisht edhe si një "shumë kontrolli". Çdo bit i mesazhit kontribuon në vlerën e CRC. Kjo është, nëse të paktën një bit i mesazhit origjinal ndryshon gjatë transmetimit, shuma e kontrollit gjithashtu do të ndryshojë, dhe në mënyrë të konsiderueshme. Ky është një plus i madh i një kontrolli të tillë, pasi ju lejon të përcaktoni në mënyrë të qartë nëse mesazhi origjinal ishte shtrembëruar gjatë transmetimit apo jo.

Hapi 2

Para se të fillojmë të llogarisim CRC, duhet pak më shumë teori.

Cili është mesazhi origjinal duhet të jetë i qartë. Shtë një sekuencë e bashkuar e copave me gjatësi arbitrare.

Cila është konstanta me të cilën duhet të ndajmë mesazhin origjinal? Ky numër është gjithashtu i çdo gjatësi, por zakonisht përdoren shumëfisha të 1 bajt - 8, 16 dhe 32 bit. Justshtë thjesht më e lehtë për tu numëruar, sepse kompjuterët punojnë me bajte, jo me bit.

Konstanta e pjesëtuesit zakonisht shkruhet si një polinom (polinom) si ky: x ^ 8 + x ^ 2 + x ^ 1 + x ^ 0. Këtu, shkalla e numrit "x" nënkupton pozicionin e një biti në numër, duke filluar nga zero, dhe biti më domethënës tregon shkallën e polinomit dhe hidhet kur interpretohet numri. Kjo është, numri i shkruar më parë nuk është asgjë më shumë se (1) 00000111 në binar, ose 7 në dhjetor. Në kllapa, unë tregova shifrën e nënkuptuar më domethënëse të numrit.

Ja një shembull tjetër: x ^ 16 + x ^ 15 + x ^ 2 + x ^ 0 = (1) 10000000000001010 = 0x8005 = 32773.

Zakonisht disa polinome standarde përdoren për lloje të ndryshme CRC.

Hapi 3

Pra, si e llogaritni shumën e kontrollit? Ekziston një metodë themelore - ndarja e një mesazhi në një polinom "ballë për ballë" - dhe modifikimet e tij në mënyrë që të zvogëlohet numri i llogaritjeve dhe, në përputhje me rrethanat, të përshpejtohet llogaritja e CRC. Ne do të shohim metodën themelore.

Në përgjithësi, ndarja e një numri me një polinom kryhet sipas algoritmit të mëposhtëm:

1) krijohet një grup (regjistër), i mbushur me zero, i barabartë në gjatësi me gjatësinë e gjerësisë së polinomit;

2) mesazhi origjinal plotësohet me zero në bitët më pak të rëndësishëm, në një sasi të barabartë me numrin e bitëve të polinomit;

3) një bit më i rëndësishëm i mesazhit futet në bitin më pak të rëndësishëm të regjistrit, dhe një bit lëviz nga biti më i rëndësishëm i regjistrit;

4) nëse biti i zgjatur është i barabartë me "1", atëherë bitët përmbysen (operacioni XOR, OS ekskluziv) në ato regjistra bit që korrespondojnë me ato në polinom;

5) nëse ka ende copa në mesazh, shkoni në hapin 3);

6) kur të gjitha bitët e mesazhit hynë në regjistër dhe u përpunuan nga ky algoritëm, pjesa e mbetur e ndarjes mbetet në regjistër, që është shuma e kontrollit e CRC.

Figura ilustron ndarjen e sekuencës origjinale të bitit me numrin (1) 00000111, ose polinomin x ^ 8 + x ^ 2 + x ^ 1 + x ^ 0.

Paraqitja skematike e llogaritjes së CRC
Paraqitja skematike e llogaritjes së CRC

Hapi 4

Kanë ngelur edhe dy prekje shtesë. Siç mund ta keni vërejtur, mesazhi mund të ndahet me çdo numër. Si ta zgjedhim? Ekzistojnë një numër polinomësh standardë që përdoren për të llogaritur CRC. Për shembull, për CRC32 mund të jetë 0x04C11DB7 dhe për CRC16 mund të jetë 0x8005.

Përveç kësaj, në regjistër në fillim të llogaritjes, mund të shkruani jo zero, por ndonjë numër tjetër.

Gjithashtu, gjatë llogaritjeve, menjëherë para lëshimit të shumës përfundimtare të kontrollit CRC, ato mund të ndahen me ndonjë numër tjetër.

Dhe gjëja e fundit. Bitet e mesazhit kur shkruani në regjistër mund të vendosen si biti më domethënës "përpara", dhe anasjelltas, më pak i rëndësishëm.

Hapi 5

Bazuar në të gjitha më lart, le të shkruajmë një funksion Basic. NET që llogarit shumën e kontrolluar të CRC duke marrë një numër parametrash që përshkrova më lart dhe duke kthyer vlerën CRC si një numër 32-bit pa firmosur.

Funksioni i Përbashkët Publik GetCrc (Bytes ByVal As Byte (), ByVal poly As UInteger, Optional ByVal Gjerësia Si Integer = 32, Optional ByVal InitReg As UInteger = & HFFFFFFFFUI, Optional ByVal finalXor As UInteger = & HFFFFFFFFUAL BALY BANSOR reverseCrc Si Boolean = E Vërtetë) Si UInteger

Gjerësia e zbehtëInBytes Si Integer = gjerësia / 8

'Plotësoni gjerësinë e mesazhit me zero (llogaritja në bajt):

ReDim Ruaj bajtët (bajte. Gjatësia - 1 + gjerësiaInBytes)

'Krijo një radhë pak nga mesazhi:

Dim msgFifo Si Radhë e Re (Nga Boolean) (bajt. Numërimi * 8 - 1)

Për secilin b Si bajt në bajt

Dim ba as BitArray i ri ({b})

Nëse reverseBytes Atëherë

Për i Si Integer = 0 deri në 7

msgFifo. Enqueue (ba (i))

Tjetra

Tjetër

Për i Si Integer = 7 deri në 0 Hapi -1

msgFifo. Enqueue (ba (i))

Tjetra

Fundi Nëse

Tjetra

'Krijoni një radhë nga pjesët fillestare të plotësimit të regjistrit:

Zbardh iniciativat si bajt () = BitConverter. GetBytes (initReg)

Fillimi i zbehtë i kthyeshëm si i numërueshëm (nga bajt) = (nga b si bajt në initBytes Merrni widthInBytes). Kthehu prapa

Dim initFifo si radhë e re (e Boolean) (gjerësia - 1)

Për secilin b Si Byte Në initBytesReversed

Dim ba as BitArray i ri ({b})

Nëse jo reverseBytes Atëherë

Për i Si Integer = 0 deri në 7

initFifo. Enqueue (ba (i))

Tjetra

Tjetër

Për i Si Integer = 7 deri në 0 Hapi -1

initFifo. Enqueue (ba (i))

Tjetra

Fundi Nëse

Tjetra

'Shift dhe XOR:

Regjistri Dim Si UInteger = 0 'plotësoni regjistrin e gjerësisë-bit me zero.

Bëje Ndërsa msgFifo. Count> 0

Dim poppedBit Si Integer = CInt (regjistri >> (gjerësia - 1)) Dhe 1 'përcakto para regjistrit të ndërrimit.

Dim i zhvendosurBit Si Byte = Convert. ToByte (msgFifo. Dequeue)

Nëse initFifo. Llogari> 0 Atëherë

Dim b As Byte = Convert. ToByte (initFifo. Dequeue)

shiftedBit = zhvendosurBit Xor b

Fundi Nëse

regjistri = regjistrohu << 1

regjistrohem = regjistrohem ose zhvendoset Bit

Nëse poppedBit = 1 Atëherë

regjistri = regjistrohu Xor poly

Fundi Nëse

Lak

'Konvertimet përfundimtare:

Dim crc Si UInteger = regjistër 'Regjistri përmban pjesën e mbetur të ndarjes == checksum.

Nëse e kundërtCrc Atëherë

crc = reflektoj (crc, gjerësi)

Fundi Nëse

crc = crc Xor finalXor

crc = crc Dhe (& HFFFFFFFFUI >> (32 - gjerësi)) 'maskojnë bitët më pak të rëndësishëm.

Kthehu CRC

Funksioni i Fundit

Recommended: