كتابة برامج لتنفيذ IEEE 802.3 تغليف إطار Ethernet.
مطلوب لرسم الواجهة ، وجزء البيانات وعنوان MAC المصدر وعنوان MAC الوجهة لإطار Ethernet هي إدخال من الواجهة ؛
يمكن إخراج حقل الاختبارات المحسوبة والنتيجة المغلفة من الواجهة ؛
إنشاء متعدد الحدود G (x) = x8+x2+x+1 ؛
نظام التشغيل واللغة والتجميع المستخدمة غير محدودة ، ولكن يجب الإشارة إلى التقرير.
قادرة على تصور عملية حساب CRC ؛
القدرة على التحكم في تشغيل البرنامج من الواجهة.
يظهر هيكل الإطار وفقًا لمعايير 802.3 في الجدول التالي (يتكون هيكل إطار Ethernet لمعايير 802.3 من 7 أجزاء)
802.3 هيكل الإطار القياسي
| رمز الرصاص | محدد ما قبل الإطار | عنوان الوجهة | عنوان المصدر | الحقل الطول | حقول البيانات | مجال التحقق |
|---|---|---|---|---|---|---|
| 7 ب | 1 ب | (6 ب) | (6 ب) | (2 ب) | (طول متغير) | (4 ب) |
من بينها ، الحد الأدنى لطول حقل بيانات الإطار هو 46 ب. إذا كان للإطار أقل من 46B ، فيجب ملء حقل البيانات إلى 46 ب. حرف الحشو تعسفي ولا يحسب لقيمة حقل الطول.
في حقل الاختيار ، يتم استخدام فحص CRC. يتضمن نطاق التحقق حقل عنوان الوجهة وحقل عنوان المصدر وحقل الطول وحقل بيانات LLC.
استخدم واجهة مرئية لتلقي عنوان الوجهة وعنوان المصدر وحقل الطول وحقل البيانات الذي أدخله المستخدم. كما يدعم توليد البيانات العشوائية ، والتي يمكن أن تقلل من إدخال المستخدم
استخدم متعدد الحدود المولدة لحساب حقل التحقق من البيانات المراد فحصها. الحقل الذي سيتم فحصه هو بايت عدد صحيح ، وترتيب متعدد الحدود الناتج لا يتجاوز 32 ، والباقي المحسوب هو 4 بايت.
تقليد لوحة مفاتيح الإدخال البتة في حاسبة Windows 10 ، مما يسمح للمستخدمين بإدخال وإنشاء متعدد الحدود والبيانات الأخرى من خلال النقر على الماوس
يحدث الإطار بعد حساب FCs إلى جهاز الاستقبال ، ويمكن للمستقبل التحقق مما إذا كان هناك خطأ. يمكنك محاكاة الأخطاء ، مثل تعديل البيانات يدويًا ثم التحقق مما إذا كان هناك خطأ.
باستخدام بيانات ثنائية أقصر ، عرض عملية حساب CRC ديناميكيًا ودعم وظيفة التحقق من الدعم. يمكن تخصيص وقت تأخير كل خطوة للتحكم في سرعة العرض ويمكن إيقاف العرض التقديمي في أي وقت.
وفقا للصيغة التالية
يمكن أن تحصل
وهذا هو ، توسيع عدد n مرات ، ثم أضف الباقي. في هذا الوقت ، لا يزال الجزء المتبقي من $$ mod m $$ دون تغيير

private byte [ ] CalcCRC ( string v )
{
var data = new Queue < char > ( v . ToArray ( ) ) ; // 被除数
char [ ] divisor = binaryString . ToArray ( ) ; // 除数
Queue < char > S = new Queue < char > ( ) ; // 商
int width = divisor . Length ; // 每次取 width 个字符进行异或运算
Queue < char > str = new Queue < char > ( ) ; // 每次取的长度为 width 的部分被除数
// 获取前 width - 1 个字符,填入到str中
for ( int i = 0 ; i < width - 1 ; i ++ )
{
str . Enqueue ( data . Dequeue ( ) ) ;
}
while ( data . Count != 0 )
{
str . Enqueue ( data . Dequeue ( ) ) ;
if ( str . First ( ) == '0' )
{
S . Enqueue ( '0' ) ;
str . Dequeue ( ) ;
}
else
{
S . Enqueue ( '1' ) ;
var temp = str . ToArray ( ) ;
str . Clear ( ) ;
for ( int i = 1 ; i < temp . Length ; i ++ )
{
str . Enqueue ( temp [ i ] == divisor [ i ] ? '0' : '1' ) ;
}
}
}
// 计算已经结束,str中的值就是结果,下面的代码可以不用看了
// 将str中的值转成4个字节的二进制数组
var res = new string ( str . ToArray ( ) ) . PadLeft ( 32 , '0' ) ;
var result = new byte [ 4 ] ;
// 将字符串格式化为byte
for ( int i = 0 ; i < 4 ; i ++ )
{
result [ i ] = Convert . ToByte ( res . Substring ( i * 8 , 8 ) , 2 ) ;
}
return result ;
}البيانات المعلقة: 1010 0111 0110 0
توليد متعدد الحدود: 1010 1101 0 (
ضع جميع البيانات المعلقة في data قائمة الانتظار
data = [1010011101100]
قم بإنشاء متعدد الحدود من 9 بت ، لذلك أولاً اترك العناصر 8 الأولى من data قائمة الانتظار وتضع البيانات في قائمة الانتظار str
str = [10100111]
data = [01100]
data.Count = 5 ! = 0 ، تابع التنفيذ
إزالة العنصر الأول من data قائمة الانتظار ووضعه في str الانتظار
str = [101001110]
data = [1100]
العنصر الأول من str هو 1
أدخل 1 في العمود S
قم بتنفيذ Bitwise Exclusive أو قيمة str الانتظار وقيمة متعدد الحدود التي تم إنشاؤها ، ونسخ آخر 8 أحرف من النتيجة إلى str 101001110 ^ 10101101010 = 000010100
S = [1]
str = [00010100]
data = [1100]
data.Count = 4 ! = 0 ، تابع التنفيذ
إزالة العنصر الأول من data قائمة الانتظار ووضعه في str الانتظار
S = [1]
str = [000101001]
data = [100]
العنصر الأول من str هو 0
أدخل 0 في العمود S ودع str أول عنصر dequeue
S = [10]
str = [00101001]
data = [100]
data.Count = 3 ! = 0 ، تابع التنفيذ
إزالة العنصر الأول من data قائمة الانتظار ووضعه في str الانتظار
S = [10]
str = [001010011]
data = [00]
العنصر الأول من str هو 0
أدخل 0 في العمود S ودع str أول عنصر dequeue
S = [100]
str = [01010011]
data = [00]
قائمة الانتظار data.Count = 2 ! = 0 ، تابع التنفيذ
إزالة العنصر الأول من data قائمة الانتظار ووضعه في str الانتظار
S = [100]
str = [010100110]
data = [0]
العنصر الأول من str هو 0
أدخل 0 في العمود S ودع str أول عنصر dequeue
S = [1000]
str = [10100110]
data = [0]
قائمة الانتظار data.Count = 1 ! = 0 ، تابع التنفيذ
إزالة العنصر الأول من data قائمة الانتظار ووضعه في str الانتظار
S = [1000]
str = [101001100]
data = []
العنصر الأول من str هو 1
أدخل 1 في العمود S
قم بتنفيذ Bitwise Exclusive أو قيمة قائمة الانتظار str وقيمة متعدد الحدود المولدة ، ونسخ آخر 8 أحرف من النتيجة إلى str 101001100 ^ 10101101010 = 000010110
S = [10001]
str = [00010110]
data = []
data.Count = 0 قائمة S = 10001 str = 00010110
عملية الحساب بأكملها هي:







