Напишите программы для реализации инкапсуляции кадров IEEE 802.3.
Требуется нарисовать интерфейс, а часть данных, источник MAC -адрес и MAC -адрес назначения в рамке Ethernet вводится из интерфейса;
Рассчитанное поле контрольной суммы и инкапсулированный результат могут быть выведены из интерфейса;
Генерировать многочлен G (x) = x8+x2+x+1;
Используемая операционная система, языковая и компиляционная среда не ограничены, но должны быть отмечены в отчете.
Способен визуализировать процесс расчета CRC;
Возможность управления работой программы из интерфейса.
Структура кадра в соответствии со стандартом 802.3 показана в следующей таблице (структура рамки Ethernet из стандарта 802.3 состоит из 7 частей)
802.3 Стандартная структура кадра
| Ведущий код | Предварительный разделитель | Адрес назначения | Адрес источника | Поле длины | Поля данных | Поле проверки |
|---|---|---|---|---|---|---|
| 7b | 1B | (6b) | (6b) | (2b) | (Переменная длина) | (4b) |
Среди них минимальная длина поля данных кадра составляет 46B. Если кадр имеет менее 46b, поле данных должно быть заполнено до 46B. Символ накладки является произвольным и не учитывается до значения поля длины.
В поле проверки используется проверка CRC. Сфера проверки включает в себя поле адреса назначения, поле адреса источника, поле длины и поле данных LLC.
Используйте визуальный интерфейс для получения адреса назначения, адреса источника, поля длины и поля данных, введенного пользователем. Он также поддерживает генерацию случайных данных, которые могут уменьшить ввод пользователя
Используйте сгенерированное многочлен для расчета поле проверки данных, которые будут проверены. Поле, которое должно быть проверено, является целочисленным байтом, порядок полученного полинома не превышает 32, а рассчитанные остатки составляют 4 байта.
Подражая клавиатуре битового ввода калькулятора Windows 10, позволяя пользователям вводить и генерировать полиномы и другие данные, нажав на мышь, нажав на мышь
Кадр после расчета FCS встречается с приемником, и приемник может проверить, есть ли ошибка. Вы можете смоделировать ошибки, такие как вручную изменять данные, а затем проверить, есть ли ошибка.
Используя более короткие двоичные данные, динамически отображают процесс расчета CRC и функцию проверки поддержки. Время задержки каждого шага может быть настроено для управления скоростью дисплея, и презентация может быть остановлена в любое время.
Согласно следующей формуле
Может получить
То есть расширяйте число и раз, а затем добавьте остаток. В настоящее время оставшаяся часть $$ 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]
Queue data.Count = 5 ! = 0, продолжить выполнение
Dequeue Первый элемент data очереди и поместите его в str
str = [101001110]
data = [1100]
Первый элемент str - 1
Вставьте 1 в колонку S
Выполните бить эксклюзивным или значением очереди str и значения сгенерированного полинома и скопируйте последние 8 символов результата str 101001110 ^ 10101101010 = 000010100
S = [1]
str = [00010100]
data = [1100]
data.Count = 4 ! = 0, продолжить выполнение
Dequeue Первый элемент data очереди и поместите его в str
S = [1]
str = [000101001]
data = [100]
Первый элемент str - 0
Вставьте 0 в столбец S и дайте первым элементом str Dequeue
S = [10]
str = [00101001]
data = [100]
data.Count = 3 ! = 0, продолжить выполнение
Dequeue Первый элемент data очереди и поместите его в str
S = [10]
str = [001010011]
data = [00]
Первый элемент str - 0
Вставьте 0 в столбец S и дайте первым элементом str Dequeue
S = [100]
str = [01010011]
data = [00]
data.Count = 2 ! = 0, продолжить выполнение
Dequeue Первый элемент data очереди и поместите его в str
S = [100]
str = [010100110]
data = [0]
Первый элемент str - 0
Вставьте 0 в столбец S и дайте первым элементом str Dequeue
S = [1000]
str = [10100110]
data = [0]
data.Count = 1 ! = 0, продолжить выполнение
Dequeue Первый элемент data очереди и поместите его в str
S = [1000]
str = [101001100]
data = []
Первый элемент str - 1
Вставьте 1 в колонку S
Выполните бить эксклюзив или значения очереди str и значение сгенерированного полинома и скопируйте последние 8 символов результата str 101001100 ^ 10101101010 = 000010110
S = [10001]
str = [00010110]
data = []
data.Count = 0 == 0, End, остаток str = 00010110 , коэффициент - S = 10001
Весь процесс расчета:







