Mac帧封装模拟-FCS冗余码计算

来源:互联网 发布:淘宝食品流通许可证办理 编辑:程序博客网 时间:2024/05/17 20:25

        一直没有时间更新博客,最近课的确重,昨天计算机网络的一个作业(Mac帧的封装)花了我一个晚上的时间,写代码写到了凌晨1点,一个Bug还是今天下午修好的。通过这次作业总结出一个道理:没有好好设计直接编码会让自己几近崩溃,代码越写越感觉混乱,越写越想全删了重来。可是今天就得交,所以硬着头皮一个个Bug修。出于想写写博客但是找不到内容的时候就把这次作业贴出来了 =.= !


        我封装模拟的Mac帧格式是这样的:

同步码帧定界目的地址源地址类型IP数据包冗余码synnc_code_(7B)soh_(1B)dst_(6B)src_(6B)type_(2B)ip_packet_(46~1500B)fcs_(4B)101010...1010101011(1B)...(6B)...(6B)IP:0x0800
Novell IPX: 0x8137(2B)
......


          我的实现是用Qt做了个界面,核心用到了Qt::QBitArray。

FCS冗余码的计算方法(MacFrame类中有CRC-16生成多项式、CRC-CCITT生成多项式、CRC-32生成多项式的FCS计算实现):

   1: /*其中的enum值、调用的函数在MacFrame这个类中,可查看源代码*/
   2: QBitArray MacFrame::compute_fcs() const
   3: {
   4:     int n = MacFrame::S_DIVISOR.count();
   5:     QBitArray remainder(n);
   6:     QBitArray data = dst_;
   7:     //计算冗余码的时候把处前导码(同步码和帧定界)除外的其它数据都检验,故合并操作:
   8:     MacFrame::mergeQBitArray(data, src_); //把两个 QBitArray 合并
   9:     MacFrame::mergeQBitArray(data, type_);
  10:     MacFrame::mergeQBitArray(data, ip_packet_);
  11:     // n 为除数的位数,需要在检验数据 data 的后面补 n-1 位0
  12:     data.resize(data.size() + n - 1); 
  13:     int size = data.size();
  14:  
  15:     for(int i = 0; i < n; i++)
  16:     {
  17:         remainder[i] = data[i]; //初始化余数
  18:     }
  19:     // 循环做模2除法
  20:     for(int i = n; i < size; )
  21:     {
  22:         while(remainder[0] == false)
  23:         {
  24:             for(int j = 0; j < n - 1; j++)
  25:             {
  26:                 remainder[j] = remainder[j+1];
  27:             }
  28:             if(i == size)
  29:             {
  30:                 goto label;
  31:             }
  32:             remainder[n-1] = data[i];
  33:             i++;
  34:         }
  35:         remainder ^= MacFrame::S_DIVISOR;
  36:     }
  37: label:
  38:     //获取 FCS 冗余码(一共4B)
  39:     size = FCS_SIZE * BYTE_SIZE;
  40:     QBitArray fcs(size);
  41:     for(size--, n--; n > 0; n--, size--)
  42:     {
  43:         fcs[size] = remainder[n];
  44:     }
  45:     return fcs;
  46: }


         文件写入:

2012-11-14_2045

aaaa aaaa aaaa aa:同步码

ab:帧定界

d81d f8a3 ac34:目的地址

711f 3faf e92d:源地址

0800 : IP数据报格式

4865…2e2e:IP数据包内容

0000 b834:冗余码


        软件的界面形式:

2012-11-14_2051

2012-11-14_2052


katoonNeteaseSinaQQCSDN@Ggicci 本文属于个人学习笔记,如有错误,希望您能指正!转载请注明出处,谢谢 :) [CSDN博客]