በይነመረቡ ላይ የ CRC ቼክሰምን ለማስላት ብዙ አማራጮች አሉ ፡፡ ግን በትክክል ቼክ ምንድን ነው እና ለምን በዚህ መንገድ ይሰላል? እስቲ እናውቀው ፡፡
መመሪያዎች
ደረጃ 1
በመጀመሪያ ፣ ትንሽ የንድፈ ሀሳብ (ፅንሰ-ሀሳብ) እናገኝ ፡፡ ስለዚህ በትክክል CRC ምንድነው? በአጭሩ ይህ ከቼክ ስሌት ዓይነቶች አንዱ ነው ፡፡ በመገናኛ መንገዶች ላይ ሲያስተላልፍ በተቀባዩ በኩል የተቀበለውን መረጃ ታማኝነት ለመፈተሽ ቼክሱም ነው ፡፡ ለምሳሌ ፣ ከቀላል ቼኮች አንዱ የእኩልነት ቢትን መጠቀሙ ነው ፡፡ የተላለፈው የመልእክት ቢት ሁሉ ሲደመር ይህ ሲሆን ድምር እኩል ሆኖ ከተገኘ ከዚያ 0 በመልእክቱ መጨረሻ ላይ ታክሏል ፣ ያልተለመደ ከሆነ ፣ ከዚያ 1. በሚቀበሉበት ጊዜ የ የመልዕክት ቢት እንዲሁ ተቆጥሮ ከተቀበለው የእኩልነት ቢት ጋር ይነፃፀራል። የሚለያዩ ከሆነ በስርጭቱ ወቅት ስህተቶች ተከስተው የተላለፈው መረጃ ተዛብቷል ፡፡
ነገር ግን የስህተቶች መኖርን ለመለየት ይህ ዘዴ በጣም መረጃ ሰጭ እና ሁልጊዜ አይሰራም ፣ ምክንያቱም በርካታ የመልእክቱ ቁርጥራጭ የተዛባ ከሆነ ፣ የገንዘቡ አካልነት ላይቀየር ይችላል። ስለሆነም ሲአርሲአርን ጨምሮ ብዙ ተጨማሪ “የላቁ” ቼኮች አሉ።
በእውነቱ ፣ ሲአርሲ ድምር አይደለም ፣ ግን የተወሰነ መረጃ (የመረጃ መልእክት) በቋሚ የመከፋፈል ውጤት ነው ፣ ወይም ይልቁንም ቀሪውን መልእክት በቋሚ በመከፋፈል። ሆኖም CRC እንዲሁ በታሪክ “ቼክሱም” ተብሎ ይጠራል። እያንዳንዱ ትንሽ መልእክት ለሲአርሲአር እሴት አስተዋፅዖ ያደርጋል ፡፡ ማለትም ፣ በሚተላለፍበት ጊዜ ቢያንስ አንድ የመጀመሪያ መልእክት ከተለወጠ ቼኩም እንዲሁ ይለወጣል ፣ እና በከፍተኛ ሁኔታ። ይህ በሚተላለፍበት ጊዜ የመጀመሪያው መልእክት የተዛባ መሆኑን ወይም አለመሆኑን በማያሻማ ሁኔታ ለመለየት ስለሚያስችል ይህ እንደዚህ ያለ ቼክ ትልቅ ተጨማሪ ነው ፡፡
ደረጃ 2
ሲአርሲውን ማስላት ከመጀመራችን በፊት ትንሽ ተጨማሪ ንድፈ ሀሳብ ያስፈልጋል ፡፡
ዋናው መልእክት ምንድነው ግልፅ መሆን አለበት ፡፡ የዘፈቀደ ርዝመት የነጠላዎች ተያያዥ ቅደም ተከተል ነው።
ዋናውን መልእክት የምንከፋፈልበት ቋሚ ምንድነው? ይህ ቁጥር እንዲሁ ማንኛውም ርዝመት አለው ፣ ግን ብዙውን ጊዜ የ 1 ባይት ብዜቶች ጥቅም ላይ ይውላሉ - 8 ፣ 16 እና 32 ቢት። መቁጠር ቀላል ነው ፣ ምክንያቱም ኮምፒውተሮች የሚሠሩት ከብቶች ጋር ሳይሆን በባይቶች ነው ፡፡
የከፋፋይ ቋሚው ብዙውን ጊዜ እንደዚህ ባለ ብዙ ቁጥር (polynomial) የተፃፈ ነው-x ^ 8 + x ^ 2 + x ^ 1 + x ^ 0። እዚህ ፣ የ “x” መጠን ማለት ከዜሮ ጀምሮ በቁጥር ውስጥ የአንድ-ቢት አቀማመጥ ማለት ሲሆን በጣም አስፈላጊው ቢት ደግሞ የብዙ ቁጥርን ደረጃ ያሳያል እና ቁጥሩን ሲተረጎም ይጣላል። ይኸውም ቀደም ሲል የተጻፈው ቁጥር በሁለት (1) 00000111 ወይም በአስርዮሽ ከ 7 አይበልጥም ፡፡ በቅንፍ ውስጥ በጣም አስፈላጊ የሆነውን የቁጥሩን አኃዝ አመልክቻለሁ ፡፡
ሌላ ምሳሌ ይኸውልህ: x ^ 16 + x ^ 15 + x ^ 2 + x ^ 0 = (1) 1000000000000101 = 0x8005 = 32773.
ብዙውን ጊዜ አንዳንድ መደበኛ ፖሊኖሚሎች ለተለያዩ የ CRC ዓይነቶች ያገለግላሉ ፡፡
ደረጃ 3
ስለዚህ ቼኩን እንዴት እንደሚያሰሉ? አንድ መሠረታዊ ዘዴ አለ - አንድ መልእክት ወደ ፖሊመላይያል “ራስ-ላይ” በመከፋፈል - እና ስሌቶቹን ቁጥር ለመቀነስ እና በዚህም መሠረት የሲአርሲ ስሌትን ለማፋጠን ፡፡ መሠረታዊውን ዘዴ እንመለከታለን.
በአጠቃላይ የቁጥሩን በፖሊኖሚያል ክፍፍል በሚከተለው ስልተ-ቀመር መሠረት ይከናወናል-
1) ከፖሊነም ወርድ ርዝመት ጋር እኩል በሆነ በዜሮዎች የተሞላ ድርድር (ምዝገባ) ተፈጠረ;
2) የመጀመሪያው መልእክት ከፖሊኖሚሊያ ቢቶች ብዛት ጋር በሚመሳሰል መጠን በትንሹ ጉልህ ቢቶች በዜሮዎች ይሞላል ፤
3) አንድ በጣም ጠቃሚ የሆነ የመልእክት በትንሹ ወደ ጉልህ መዝገብ ውስጥ ገብቷል ፣ እና አንድ ቢት ከምዝገባው በጣም አስፈላጊ ከሆነው ቢት ይንቀሳቀሳል ፣
4) የተራዘመው ቢት ከ “1” ጋር እኩል ከሆነ ፣ ቢቲው ፖሊሞሚል ውስጥ ከሚገኙት ጋር በሚዛመዱ በእነዚያ የመመዝገቢያ ቢቶች ውስጥ ይገለበጣሉ (XOR operation, exclusive OR);
5) በመልእክቱ ውስጥ አሁንም ጥቃቅን ከሆኑ ወደ ደረጃ 3 ይሂዱ);
6) ሁሉም የመልእክቱ ጥቃቅን ወደ ምዝገባው ሲገቡ እና በዚህ ስልተ ቀመር ሲከናወኑ ቀሪው ክፍፍል በመዝገቡ ውስጥ ይቀራል ፣ ይህም የ CRC ቼክሱም ነው ፡፡
ስዕሉ የመጀመሪያውን (ቢት) ቅደም ተከተል ክፍፍል በቁጥር (1) 00000111 ፣ ወይም ባለብዙ ቁጥር x ^ 8 + x ^ 2 + x ^ 1 + x ^ 0 ያሳያል።
ደረጃ 4
ሁለት ተጨማሪ ንክኪዎች ቀርተዋል ፡፡ ምናልባት እንደተገነዘቡት መልእክቱ በማንኛውም ቁጥር ሊከፈል ይችላል ፡፡ እንዴት እንደሚመረጥ? ሲአርሲን ለማስላት የሚያገለግሉ መደበኛ መደበኛ ፖሊመኖች አሉ ፡፡ ለምሳሌ ለ CRC32 0x04C11DB7 ሊሆን ይችላል ፣ ለ CRC16 ደግሞ 0x8005 ሊሆን ይችላል ፡፡
በተጨማሪም ፣ በስሌቱ መጀመሪያ ላይ በመዝገቡ ውስጥ ዜሮዎችን ሳይሆን ሌላ ቁጥር መጻፍ ይችላሉ ፡፡
እንዲሁም ፣ በስሌቶች ወቅት ፣ የመጨረሻውን የ CRC ቼክየም ከመስጠቱ በፊት ወዲያውኑ በሌላ ቁጥር ሊከፋፈሉ ይችላሉ።
እና የመጨረሻው ነገር ፡፡ ለመመዝገቢያው በሚጽፉበት ጊዜ የመልእክቱ ባይት በጣም ጉልህ የሆነ ትንሽ “ወደፊት” ፣ እና በተቃራኒው ደግሞ በጣም አነስተኛ እንደሆነ ሊቀመጥ ይችላል።
ደረጃ 5
ከላይ በተጠቀሱት ሁሉ ላይ በመመስረት ከላይ የገለፅኳቸውን በርካታ መለኪያዎች በመውሰድ እና የ CRC እሴቱን እንደ ባለ 32 ቢት ያልተፈረመ ቁጥር በመመለስ የ CRC ቼክሱን የሚያሰላ መሰረታዊ.
ይፋዊ የጋራ ተግባር ጌትኮር (ባይቫል ባይቶች አስ ባይ () ፣ ባይቫል ፖሊ እንደ ኡኢንገር ፣ አማራጭ ባይቫል ስፋት እንደ ኢንቲመር = 32 ፣ አማራጭ የባይቫል initReg እንደ UInteger = & HFFFFFFFFUI ፣ አማራጭ ባቫል የመጨረሻ) ተገላቢጦሽ እንደ ቡሊያን = እውነተኛ) እንደ UInteger
ደብዛዛ ስፋትInBytes እንደ ኢንቲጀር = ስፋት / 8
የመልእክቱን ስፋት በዜሮዎች ይሙሉ (ስሌት በባይቶች)
ሪዲም ባይትዎችን ይጠብቁ (ባይት ርዝመት - 1 + ስፋት InBytes)
ከመልዕክቱ ትንሽ ወረፋ ይፍጠሩ
ዲም msgFifo እንደ አዲስ ወረፋ (የቦሊያን) (ባይትስ ቁጥር * 8 - 1)
ለእያንዳንዱ ለ እንደ ባይት In ባይት
Dim ba As New BitArray ({b})
የተገላቢጦሽ ከሆነ ከዚያ
ለ i እንደ ኢንቲጀር = ከ 0 እስከ 7
msgFifo. Enqueue (ba (i))
ቀጣይ
ሌላ
ለ i እንደ ኢንቲጀር = 7 እስከ 0 ደረጃ -1
msgFifo. Enqueue (ba (i))
ቀጣይ
ጨርስ ከሆነ
ቀጣይ
ከመመዝገቢያው የመጀመሪያ የመሙያ ቁራጭ ወረፋ ይፍጠሩ-
ደብዛዛ initBytes As Byte () = BitConverter. GetBytes (initReg)
ደብዛዛ initBytes እንደ ቁጥር (በባይ) ተመልሷል = (ከ ቢ እንደ ባይ ባይ ውስጥ initBytes ስፋት ውሰድ INBytes)።
ዲፊ inifFifo እንደ አዲስ ወረፋ (የቦሊያን) (ስፋት - 1)
ለእያንዳንዱ ቢ እንደ ባይት initBytesReversed
Dim ba As New BitArray ({b})
ካልተገለበጠ ከዚያ በኋላ
ለ i እንደ ኢንቲጀር = ከ 0 እስከ 7
initFifo. Enqueue (ba (i))
ቀጣይ
ሌላ
ለ i እንደ ኢንቲጀር = 7 እስከ 0 ደረጃ -1
initFifo. Enqueue (ba (i))
ቀጣይ
ጨርስ ከሆነ
ቀጣይ
'Shift እና XOR
ዲም ምዝገባ እንደ UInteger = 0 'ስፋት-ቢት ምዝገባውን በዜሮዎች ይሙሉ።
MsgFifo እያለ ያድርጉ። ቁጥር> 0
ደብዛዛ ብቅ ቢት እንደ ኢንቲጀር = CInt (መዝገብ >> (ስፋት - 1)) እና 1 'ከዝውውር ምዝገባ በፊት ይግለጹ።
ዲም ተቀየረ ቢት እንደ ባይት = Convert. ToByte (msgFifo. Dequeue)
InitFifo. ቆጠራ> 0 ከዚያ
Dim b As Byte = Convert. ToByte (initFifo. Dequeue)
ተዛወረ ቢት = ተቀይሯል ቢት Xor ለ
ጨርስ ከሆነ
ይመዝገቡ = ይመዝገቡ << 1
ምዝገባ = ምዝገባ ወይም ተዛወረ ቢት
ብቅ ቢል = 1 ከዚያ
ምዝገባ = ምዝገባ Xor poly
ጨርስ ከሆነ
ሉፕ
የመጨረሻ ልወጣዎች
Dim crc As UInteger = መዝገብ 'መዝገቡ ቀሪውን ክፍልፋይ ይ=ል == ቼክሱም።
ከተገላቢጦሽ ክሪክ ከዚያ
CRc = አንፀባራቂ (ክሬክ ፣ ስፋት)
ጨርስ ከሆነ
crc = crc Xor finalXor
crc = crc እና (& HFFFFFFFFUI >> ((32 - ስፋት)) 'ትንሹን ጉልህ ቢቶች ይሸፍኑ።
ተመለስ crc
የማጠናቀቂያ ተግባር