注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

G G I C C I

 
 
 

日志

 
 

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

2012-11-14 20:56:20|  分类: 算法分析 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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


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

同步码 帧定界 目的地址 源地址 类型 IP数据包 冗余码
synnc_code_(7B) soh_(1B) dst_(6B) src_(6B) type_(2B) ip_packet_(46~1500B) fcs_(4B)
101010...10 10101011(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:冗余码


        软件的界面形式:

Mac帧封装模拟-FCS冗余码计算 - _________杰 - G G I C C I
 
Mac帧封装模拟-FCS冗余码计算 - _________杰 - G G I C C I
 

Mac帧封装模拟-FCS冗余码计算 - _________杰 - G G I C C I
katoon Netease  Sina  QQ  CSDN
@Ggicci 本文属于个人学习笔记,如有错误,希望您能指正!转载请注明出处,谢谢 :) [网易博客]
  评论这张
 
阅读(1158)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017