ما مدى سهولة حساب المجموع الاختباري لـ CRC (CRC32 - CRC16 - CRC8)

جدول المحتويات:

ما مدى سهولة حساب المجموع الاختباري لـ CRC (CRC32 - CRC16 - CRC8)
ما مدى سهولة حساب المجموع الاختباري لـ CRC (CRC32 - CRC16 - CRC8)

فيديو: ما مدى سهولة حساب المجموع الاختباري لـ CRC (CRC32 - CRC16 - CRC8)

فيديو: ما مدى سهولة حساب المجموع الاختباري لـ CRC (CRC32 - CRC16 - CRC8)
فيديو: 57. CRC алгоритм (Урок 48. Теория) 2024, شهر نوفمبر
Anonim

هناك العديد من الخيارات لحساب المجموع الاختباري CRC على الإنترنت. ولكن ما هو المجموع الاختباري بالضبط ولماذا يتم حسابه بهذه الطريقة؟ دعونا نفهم ذلك.

ما مدى سهولة حساب المجموع الاختباري لـ CRC (CRC32 - CRC16 - CRC8)
ما مدى سهولة حساب المجموع الاختباري لـ CRC (CRC32 - CRC16 - CRC8)

تعليمات

الخطوة 1

أولاً ، دعنا نحصل على القليل من النظرية. إذن ما هي اتفاقية حقوق الطفل بالضبط؟ باختصار ، هذا أحد أنواع حساب المجموع الاختباري. المجموع الاختباري هو طريقة للتحقق من سلامة المعلومات المستلمة على جانب المستقبل عند الإرسال عبر قنوات الاتصال. على سبيل المثال ، أحد أبسط عمليات التحقق هو استخدام بت التكافؤ. هذا عندما يتم تلخيص جميع وحدات بت الرسالة المرسلة ، وإذا تبين أن المجموع متساوٍ ، تتم إضافة 0 إلى نهاية الرسالة ، إذا كانت فردية ، ثم 1. عند الاستلام ، يتم جمع مجموع يتم أيضًا حساب بتات الرسالة ومقارنتها مع بت التكافؤ المستقبَل. في حالة اختلافهما ، حدثت أخطاء أثناء الإرسال وتشوهت المعلومات المرسلة.

لكن هذه الطريقة في الكشف عن وجود أخطاء غير مفيدة للغاية ولا تعمل دائمًا ، لأن إذا تم تشويه عدة أجزاء من الرسالة ، فقد لا يتغير تكافؤ المجموع. لذلك ، هناك العديد من عمليات التحقق "المتقدمة" ، بما في ذلك CRC.

في الواقع ، CRC ليس مجموعًا ، ولكنه نتيجة قسمة كمية معينة من المعلومات (رسالة المعلومات) على ثابت ، أو بالأحرى ، ما تبقى من قسمة رسالة على ثابت. ومع ذلك ، يشار إلى اتفاقية حقوق الطفل تاريخيًا أيضًا باسم "المجموع الاختباري". يساهم كل جزء من الرسالة في قيمة CRC. وهذا يعني أنه إذا تغير جزء واحد على الأقل من الرسالة الأصلية أثناء الإرسال ، فإن المجموع الاختباري سيتغير أيضًا وبشكل ملحوظ. هذه إضافة كبيرة لمثل هذا الفحص ، لأنها تتيح لك تحديد ما إذا كانت الرسالة الأصلية مشوهة أثناء الإرسال أم لا.

الخطوة 2

قبل أن نبدأ في حساب اتفاقية حقوق الطفل ، هناك حاجة إلى مزيد من النظرية.

ما هي الرسالة الأصلية يجب أن تكون واضحة. إنه تسلسل متجاور من البتات ذات الطول التعسفي.

ما هو الثابت الذي يجب أن نقسم به الرسالة الأصلية؟ هذا الرقم أيضًا بأي طول ، ولكن عادةً ما يتم استخدام مضاعفات 1 بايت - 8 و 16 و 32 بت. من الأسهل العد ، لأن أجهزة الكمبيوتر تعمل بالبايت وليس بالبتات.

عادة ما يتم كتابة ثابت المقسوم عليه في صورة كثير الحدود (متعدد الحدود) مثل هذا: x ^ 8 + x ^ 2 + x ^ 1 + x ^ 0. هنا ، تعني درجة الرقم "x" موضع البتة الواحدة في الرقم ، بدءًا من الصفر ، وتشير البتة الأكثر أهمية إلى درجة كثير الحدود ويتم تجاهلها عند تفسير الرقم. أي أن الرقم المكتوب مسبقًا لا يزيد عن (1) 00000111 في النظام الثنائي ، أو 7 في النظام العشري. بين قوسين ، أشرت إلى الرقم الأكثر أهمية ضمنيًا من الرقم.

إليك مثال آخر: x ^ 16 + x ^ 15 + x ^ 2 + x ^ 0 = (1) 1000000000000101 = 0x8005 = 32773.

عادةً ما تُستخدم بعض كثيرات الحدود القياسية لأنواع مختلفة من CRCs.

الخطوه 3

إذن كيف تحسب المجموع الاختباري؟ هناك طريقة أساسية - تقسيم الرسالة إلى متعدد الحدود "وجهاً لوجه" - وتعديلاتها من أجل تقليل عدد العمليات الحسابية ، وبالتالي تسريع حساب CRC. سننظر في الطريقة الأساسية.

بشكل عام ، يتم تقسيم الرقم بواسطة كثير الحدود وفقًا للخوارزمية التالية:

1) يتم إنشاء مصفوفة (سجل) مملوءة بالأصفار ، مساوية لطول عرض كثير الحدود ؛

2) يتم استكمال الرسالة الأصلية بأصفار في وحدات البت الأقل دلالة ، بكمية مساوية لعدد بتات كثير الحدود ؛

3) يتم إدخال بتة واحدة من أهم أجزاء الرسالة في أقل بتة ذات دلالة في السجل ، ويتم نقل بتة واحدة من أهم بت في السجل ؛

4) إذا كانت البتة الممتدة تساوي "1" ، فعندئذٍ يتم قلب البتات (عملية XOR ، حصريًا OR) في بتات التسجيل التي تتوافق مع تلك الموجودة في كثير الحدود ؛

5) إذا كان لا يزال هناك أجزاء صغيرة في الرسالة ، فانتقل إلى الخطوة 3) ؛

6) عندما دخلت جميع أجزاء الرسالة في السجل وتمت معالجتها بواسطة هذه الخوارزمية ، يظل باقي القسم في السجل ، وهو المجموع الاختباري CRC.

يوضح الشكل قسمة تسلسل البت الأصلي على الرقم (1) 00000111 ، أو متعدد الحدود x ^ 8 + x ^ 2 + x ^ 1 + x ^ 0.

تمثيل تخطيطي لحساب اتفاقية حقوق الطفل
تمثيل تخطيطي لحساب اتفاقية حقوق الطفل

الخطوة 4

هناك بضع لمسات إضافية متبقية. كما لاحظت ، يمكن تقسيم الرسالة على أي رقم. كيف تختاره؟ هناك عدد من كثيرات الحدود القياسية المستخدمة لحساب CRC. على سبيل المثال ، بالنسبة لـ CRC32 قد يكون 0x04C11DB7 ، وبالنسبة لـ CRC16 قد يكون 0x8005.

بالإضافة إلى ذلك ، في السجل في بداية الحساب ، لا يمكنك كتابة الأصفار ، ولكن بعض الأرقام الأخرى.

أيضًا ، أثناء العمليات الحسابية ، مباشرة قبل إصدار المجموع الاختباري النهائي لاتفاقية حقوق الطفل ، يمكن تقسيمها على رقم آخر.

وآخر شيء. يمكن وضع بايت الرسالة عند الكتابة إلى السجل كأهم بت "إعادة توجيه" ، والعكس صحيح ، الأقل أهمية.

الخطوة الخامسة

بناءً على كل ما سبق ، دعنا نكتب دالة Basic. NET التي تحسب المجموع الاختباري CRC عن طريق أخذ عدد من المعلمات التي وصفتها أعلاه وإرجاع قيمة CRC كرقم بدون إشارة 32 بت.

الوظيفة العامة المشتركة GetCrc (ByVal bytes As Byte ()، ByVal poly As UInteger، Optional ByVal width As Integer = 32، Optional ByVal initReg As UInteger = & HFFFFFFFFUI، Optional ByVal finalXor As UInteger = & HFFFFFFFFalytool، Optional reverseCrc كـ منطقي = صحيح) كـ UInteger

قاتمة widthInBytes بشكل صحيح = عرض / 8

استكمل عرض الرسالة بالأصفار (الحساب بالبايت):

ReDim الاحتفاظ بالبايت (بايت. الطول - 1 + العرض بالبايت)

إنشاء قائمة انتظار صغيرة من الرسالة:

Dim msgFifo كقائمة انتظار جديدة (من منطقية) (بايت. العد * 8-1)

لكل ب بايت بالبايت

Dim ba كـ BitArray جديد ({b})

إذا كان العكس Bytes ثم

بالنسبة إلى i كعدد صحيح = 0 إلى 7

msgFifo. Enqueue (ba (i))

التالي

آخر

بالنسبة إلى i كـ عدد صحيح = 7 إلى 0 الخطوة -1

msgFifo. Enqueue (ba (i))

التالي

إنهاء إذا

التالي

قم بإنشاء قائمة انتظار من بتات التعبئة الأولية للسجل:

Dim initBytes As Byte () = BitConverter. GetBytes (initReg)

Dim initBytesReversed as IEnumerable (Of Byte) = (من b كـ Byte في initBytes خذ widthInBytes).

Dim initFifo كقائمة انتظار جديدة (من منطقية) (العرض - 1)

لكل ب بايت في initBytesReversed

Dim ba كـ BitArray جديد ({b})

إذا لم يكن الأمر reverseBytes ثم

بالنسبة إلى i كعدد صحيح = 0 إلى 7

initFifo. Enqueue (ba (i))

التالي

آخر

بالنسبة إلى i كـ عدد صحيح = 7 إلى 0 الخطوة -1

initFifo. Enqueue (ba (i))

التالي

إنهاء إذا

التالي

التحول و XOR:

سجل خافت كـ UInteger = 0 'املأ سجل بت العرض بالأصفار.

افعل أثناء msgFifo. Count> 0

Dim poppedBit As Integer = CInt (تسجيل >> (العرض - 1)) و 1 'حدد قبل تسجيل التحول.

Dim shiftedBit As Byte = Convert. ToByte (msgFifo. Dequeue)

إذا initFifo. Count> 0 ثم

Dim b كـ Byte = Convert. ToByte (initFifo. Dequeue)

shiftedBit = shiftedBit Xor b

إنهاء إذا

تسجيل = تسجيل << 1

تسجيل = تسجيل أو شفتيدبيت

إذا poppedBit = 1 ثم

تسجيل = تسجيل Xor poly

إنهاء إذا

حلقه

التحويلات النهائية:

Dim crc As UInteger = register 'يحتوي السجل على باقي القسمة == المجموع الاختباري.

إذا كان reverseCrc ثم

crc = انعكاس (crc ، عرض)

إنهاء إذا

crc = crc Xor finalXor

crc = crc و (& HFFFFFFFFUI >> (32 - width)) 'إخفاء البتات الأقل أهمية.

عودة crc

وظيفة النهاية

موصى به: