الاتصال عبر MCP →

أدخل الحساب

صيغة رياضية

اعلان

نتائج

قيمة التحقق CRC (ست عشري)
0x29B1
16-bit checksum
القيمة العشرية ١٠٬٦٧٣
عرض البِتات 16 bits
عدد البايتات المُعالَجة 9

ما هي قيمة التحقق CRC؟

الفحص الدوري بالتكرار (Cyclic Redundancy Check واختصارًا CRC) هو رمز لاكتشاف الأخطاء يُستخدم على نطاق واسع في الشبكات ووسائط التخزين وصيغ الملفات (مثل Ethernet وZIP وPNG وModbus وUSB وغيرها). يتعامل هذا الأسلوب مع بياناتك باعتبارها عددًا ثنائيًا طويلًا، ثم يقسمه على كثير حدود مُولِّد ثابت باستخدام حساب ثنائي بلا حمل (في الحقل GF(2)، حيث تتطابق عمليتا الجمع والطرح مع عملية XOR). والباقي الناتج عن هذه القسمة هو قيمة CRC. وإذا تغيّر بِت واحد فقط في الرسالة، فإن الباقي يتغيّر بدوره في الغالب الأعم، وهذا ما يجعل CRC أداة ممتازة لاكتشاف أخطاء النقل والتخزين.

مخطط كتلي لرسالة مقسّمة إلى بيانات مع حقل مجموع تحقق CRC مُضاف
يضيف الـ CRC قيمة فحص قصيرة إلى البيانات حتى يمكن اكتشاف الأخطاء.

كيفية استخدام الحاسبة

اكتب أي نص بترميز ASCII في خانة الإدخال، ثم اختر صيغة CRC التي تحتاجها، واقرأ النتيجة مباشرة. تعرض الأداة قيمة التحقق بالنظامين الست عشري والعشري معًا، إلى جانب عرض البِتات وعدد البايتات التي تمت معالجتها. وتدعم الأداة ثلاث صيغ شائعة:

CRC-8 — كثير الحدود \(\mathtt{0x07}\)، والقيمة الابتدائية \(\mathtt{0x00}\).
CRC-16/CCITT-FALSE — كثير الحدود \(\mathtt{0x1021}\)، والقيمة الابتدائية \(\mathtt{0xFFFF}\)، دون انعكاس.
CRC-32 (IEEE 802.3) — كثير الحدود المنعكس \(\mathtt{0xEDB88320}\)، والقيمة الابتدائية \(\mathtt{0xFFFFFFFF}\)، مع XOR نهائي بقيمة \(\mathtt{0xFFFFFFFF}\). وهذه هي الصيغة المعتمَدة في ZIP وgzip وEthernet.

$$\text{CRC} = \mathrm{XorOut} \oplus \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}_{\text{poly}}(\text{crc}, b)$$ $$\text{where (CRC-16/CCITT-FALSE)}\quad \left\{ \begin{aligned} \text{poly} &= \mathtt{0x1021} \\ \mathrm{init} &= \mathtt{0xFFFF} \\ \mathrm{XorOut} &= \mathtt{0x0000} \\ \text{width} &= 16 \text{ bits (MSB-first, no reflection)} \end{aligned} \right.$$

شرح الصيغة الحسابية

من الناحية النظرية، تُضرب الرسالة \(M(x)\) في \(x^n\) (حيث \(n\) هي درجة المُولِّد) ثم تُقسَم على \(G(x)\). أمّا عمليًا فنستخدم سجلًّا نُزيحه بِتًّا واحدًا في كل مرة، ونُجري عليه عملية XOR مع كثير الحدود كلما كان البِت الأعلى يساوي 1. أمّا الصيغ المنعكسة (مثل CRC-32) فتعالج البِتات بدءًا من البِت الأقل أهمية، وتُزيح إلى اليمين بدلًا من اليسار.

$$\text{CRC}_{16} = \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}(\text{crc}, b)$$ $$\text{where}\quad \left\{ \begin{aligned} \mathrm{init} &= \mathtt{0xFFFF} \\ \text{poly} &= \mathtt{0x1021} \\ \text{step} &: \text{crc} \leftarrow \big(\text{crc} \ll 1\big) \oplus (\text{MSB}?\,\text{poly}:0) \\ \text{width} &= 16 \text{ bits, MSB-first} \end{aligned} \right.$$ $$\text{CRC}_{8} = \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}(\text{crc}, b)$$ $$\text{where}\quad \left\{ \begin{aligned} \mathrm{init} &= \mathtt{0x00} \\ \text{poly} &= \mathtt{0x07} \\ \text{step} &: \text{crc} \leftarrow \big(\text{crc} \ll 1\big) \oplus (\text{MSB}?\,\text{poly}:0) \\ \text{width} &= 8 \text{ bits, MSB-first} \end{aligned} \right.$$ $$\text{CRC}_{32} = \mathtt{0xFFFFFFFF} \oplus \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}(\text{crc}, b)$$ $$\text{where}\quad \left\{ \begin{aligned} \mathrm{init} &= \mathtt{0xFFFFFFFF} \\ \text{poly} &= \mathtt{0xEDB88320}\ (\text{reflected}) \\ \text{step} &: \text{crc} \leftarrow \big(\text{crc} \gg 1\big) \oplus (\text{LSB}?\,\text{poly}:0) \\ \text{width} &= 32 \text{ bits, LSB-first} \end{aligned} \right.$$
قسمة مطوّلة لكثيرات الحدود لبتات الرسالة على كثيرة حدود المولّد فوق GF(2) باستخدام خطوات XOR
الـ CRC هو باقي القسمة الثنائية لكثيرات الحدود (XOR) للرسالة على المولّد \(G(x)\).

مثال محلول

بالنسبة إلى سلسلة الفحص الكلاسيكية 123456789: تُرجع صيغة CRC-16/CCITT-FALSE القيمة 0x29B1 (أي 10673 بالنظام العشري)، بينما تُرجع صيغة CRC-32/IEEE القيمة 0xCBF43926 (أي 3421780262 بالنظام العشري). وهذه هي قيم «الفحص» القياسية المنشورة في الكتالوجات المرجعية لـ CRC، ويمكنك من خلالها التحقق من صحة أي تنفيذ برمجي ومقارنته بها.

الأسئلة الشائعة

لماذا تختلف نتيجتي عن أداة أخرى؟ تختلف صيغ CRC في كثير الحدود والقيمة الابتدائية وانعكاس البِتات وقيمة XOR النهائية. تأكّد من أنك تقارن الصيغة نفسها تمامًا.

هل CRC دالة تجزئة آمنة؟ لا. تكتشف CRC الأخطاء العَرَضية فحسب، لكن من السهل تزويرها عمدًا. استخدِم SHA-256 أو ما يماثلها لأغراض الأمان.

ما الترميز المستخدَم؟ يُؤخَذ كل محرف بقيمته البايتية المكوّنة من 8 بِتات وفق ترميز ASCII/Latin-1 قبل حساب قيمة CRC.

آخر تحديث: