【原创】手把手教你制作CRC计算小工具

                     手把手教你制作CRC计算小工具

                                 作者:小盒子    于2005年11月 大连

一、CRC工具运行效果图

2573807187042317292.jpg

二、CRC软件的功能

1.可以任意输入16进制数字,进行CRC值计算
  例如:25 10 A0 FA
2.格式任意无拘束,中间可以加任意个空格回车,不影响其最后结果
  例如  1223  44 55 66
        7F 88 99
3.可以对输出的格式进行调整,高、低字节可以互换输出
4.使用方便简单

三、源代码

Button事件源代码

void CcrcDlg::OnBnClickedButtoncrc()
{
 // TODO: 在此添加控件通知处理程序代码
 const unsigned int crctab1[]={
         0x0000,0x8005,0x800f,0x000a,0x801b,0x001e,0x0014,0x8011,
         0x8033,0x0036,0x003c,0x8039,0x0028,0x802d,0x8027,0x0022,
         0x8063,0x0066,0x006c,0x8069,0x0078,0x807d,0x8077,0x0072,
         0x0050,0x8055,0x805f,0x005a,0x804b,0x004e,0x0044,0x8041,
         0x80c3,0x00c6,0x00cc,0x80c9,0x00d8,0x80dd,0x80d7,0x00d2,
         0x00f0,0x80f5,0x80ff,0x00fa,0x80eb,0x00ee,0x00e4,0x80e1,
         0x00a0,0x80a5,0x80af,0x00aa,0x80bb,0x00be,0x00b4,0x80b1,
         0x8093,0x0096,0x009c,0x8099,0x0088,0x808d,0x8087,0x0082,
         0x8183,0x0186,0x018c,0x8189,0x0198,0x819d,0x8197,0x0192,
         0x01b0,0x81b5,0x81bf,0x01ba,0x81ab,0x01ae,0x01a4,0x81a1,
         0x01e0,0x81e5,0x81ef,0x01ea,0x81fb,0x01fe,0x01f4,0x81f1,
         0x81d3,0x01d6,0x01dc,0x81d9,0x01c8,0x81cd,0x81c7,0x01c2,
         0x0140,0x8145,0x814f,0x014a,0x815b,0x015e,0x0154,0x8151,
         0x8173,0x0176,0x017c,0x8179,0x0168,0x816d,0x8167,0x0162,
         0x8123,0x0126,0x012c,0x8129,0x0138,0x813d,0x8137,0x0132,
         0x0110,0x8115,0x811f,0x011a,0x810b,0x010e,0x0104,0x8101,
         0x8303,0x0306,0x030c,0x8309,0x0318,0x831d,0x8317,0x0312,
         0x0330,0x8335,0x833f,0x033a,0x832b,0x032e,0x0324,0x8321,
         0x0360,0x8365,0x836f,0x036a,0x837b,0x037e,0x0374,0x8371,
         0x8353,0x0356,0x035c,0x8359,0x0348,0x834d,0x8347,0x0342,
         0x03c0,0x83c5,0x83cf,0x03ca,0x83db,0x03de,0x03d4,0x83d1,
         0x83f3,0x03f6,0x03fc,0x83f9,0x03e8,0x83ed,0x83e7,0x03e2,
         0x83a3,0x03a6,0x03ac,0x83a9,0x03b8,0x83bd,0x83b7,0x03b2,
         0x0390,0x8395,0x839f,0x039a,0x838b,0x038e,0x0384,0x8381,
         0x0280,0x8285,0x828f,0x028a,0x829b,0x029e,0x0294,0x8291,
         0x82b3,0x02b6,0x02bc,0x82b9,0x02a8,0x82ad,0x82a7,0x02a2,
         0x82e3,0x02e6,0x02ec,0x82e9,0x02f8,0x82fd,0x82f7,0x02f2,
         0x02d0,0x82d5,0x82df,0x02da,0x82cb,0x02ce,0x02c4,0x82c1,
         0x8243,0x0246,0x024c,0x8249,0x0258,0x825d,0x8257,0x0252,
         0x0270,0x8275,0x827f,0x027a,0x826b,0x026e,0x0264,0x8261,
         0x0220,0x8225,0x822f,0x022a,0x823b,0x023e,0x0234,0x8231,
         0x8213,0x0216,0x021c,0x8219,0x0208,0x820d,0x8207,0x0202
        };
 unsigned int i,len,comb_val;
 unsigned char NewData,High,Low;
 unsigned short crc,he;
 unsigned char buffer[1000];
 unsigned char *CRCBuffer;
 unsigned char *buf;
 CString str;
 int rlen=0;
 crc=0;


 UpdateData(TRUE);
 len = m_InputNumber.GetLength();
 UpdateData(FALSE);
 if((len<=1))
      MessageBox("没有数据或数据不完整,请重新输入!!!");
 else if(len>=1000)
      MessageBox("输入数据过长,请与制作人联系升级程序!!!");
 else{
      str=m_InputNumber;
      for(int j=0;j<=len;) {
           High=str[j];
           if((High== ' ')||(High== 13)||(High== 10)) {
               j++;
               continue;
           }
          High = HexChar(High);
          High = High<<4;
          j++;
          Low = str[j];
          if((Low== ' ')||(Low== 13)||(Low== 10)) {
               j++;
               continue;
          }
          Low = HexChar(Low);
          NewData = High|Low;
          j++;
          buffer[rlen]=NewData;
          rlen++;
          if((str[j]== ' ')||(str[j]== 13)||(str[j]== 10)) {
              j++;
              continue;
          }
          if(j>=len)
          break;
      }
  CRCBuffer=buffer;
  for(i=0;i<rlen;i++) {
    comb_val=(crc>>8) ^ *(CRCBuffer++);
    crc =(crc<<8)^crctab1[comb_val]; 
  }
  he=crc;
  unsigned char CRCHigh,CRCLow;
  CRCHigh = (unsigned char) ((0xff00 & he)>>8);
  CRCLow = (unsigned char) (0x00ff & he);

  int strlen = str.GetLength();
  unsigned char CRCbuf[2];
  CString temp;
  CRCbuf[0]=CRCHigh;
  CRCbuf[1]=CRCLow;
  str.Insert(len,' ' );

  UpdateData(TRUE);
  int nResult=GetCheckedRadioButton(IDC_RADIO_Highahead,IDC_RADIO_Lowahead);
  if(nResult==IDC_RADIO_Highahead) {
      temp.Format("%02x",CRCHigh);
      m_CRCHigh =temp;
   } else {
      temp.Format("%02x",CRCLow);
      m_CRCLow = temp;
   }
  UpdateData(FALSE);

  str +=temp;
  str.Insert(len+3,' ' );

  UpdateData(TRUE);
  int nResult2=GetCheckedRadioButton(IDC_RADIO_Highahead,IDC_RADIO_Lowahead);
  if(nResult2==IDC_RADIO_Highahead) {
      temp.Format("%02x",CRCLow);
      m_CRCLow =temp;
   } else {
      temp.Format("%02x",CRCHigh);
      m_CRCHigh = temp;
   }
  UpdateData(FALSE);

  str +=temp;
  UpdateData(TRUE);
  m_InputNumber = str ;
  UpdateData(FALSE);
 }
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值