用心快乐、用心成功

用心.NET

博客园 首页 新随笔 联系 订阅 管理
  16 Posts :: 0 Stories :: 56 Comments :: 0 Trackbacks

using System;

namespace CRC
{
 /// <summary>
 /// CRC16 的摘要说明。
 /// </summary>
 public class CRC16:ICRC
 {
  #region CRC 16 位校验表
  
  /// <summary>
  /// 16 位校验表 Upper 表
  /// </summary>
  public ushort[] uppercrctab = new ushort[]
   {
    0x0000,0x1231,0x2462,0x3653,0x48c4,0x5af5,0x6ca6,0x7e97,
    0x9188,0x83b9,0xb5ea,0xa7db,0xd94c,0xcb7d,0xfd2e,0xef1f
   };

  /// <summary>
  /// 16 位校验表 Lower 表
  /// </summary>
  public ushort[] lowercrctab = new ushort[]
   {
    0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
    0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef
   };
  #endregion

  ushort crc = 0;

  /// <summary>
  /// 校验后的结果
  /// </summary>
  public long Value
  {
   get
   {
    return crc;
   }
   set
   {
    crc = (ushort)value;
   }
  }

  /// <summary>
  /// 设置crc 初始值
  /// </summary>
  public void Reset()
  {
   crc = 0;
  }
       
  /// <summary>
  /// Crc16
  /// </summary>
  /// <param name="ucrc"></param>
  /// <param name="buf"></param>
  public void Crc(ushort ucrc,byte[] buf)
  {
   crc = ucrc;
   Crc(buf);
  }
  
  /// <summary>
  /// Crc16
  /// </summary>
  /// <param name="bval"></param>
  public void Crc(int bval)
  {
   ushort h = (ushort)((crc >> 12) & 0x0f);
   ushort l = (ushort)((crc >> 8 ) & 0x0f);
   ushort temp = crc;
   temp =(ushort)(((temp & 0x00ff) << 8) | bval);
   temp =(ushort)(temp ^(uppercrctab[(h -1) + 1] ^ lowercrctab[(l - 1) + 1]));
   crc = temp;
  }


  /// <summary>
  /// Crc16
  /// </summary>
  /// <param name="buffer"></param>
  public void Crc(byte[] buffer)
  {
   Crc(buffer,0,buffer.Length);
  }

  /// <summary>
  /// Crc16
  /// </summary>
  /// <param name="buf"></param>
  /// <param name="off"></param>
  /// <param name="len"></param>
  public void Crc(byte[] buf,int off,int len)
  {
   if (buf == null)
   {
    throw new ArgumentNullException("buf");
   }
   
   if (off < 0 || len < 0 || off + len > buf.Length)
   {
    throw new ArgumentOutOfRangeException();
   }
   for (int i = off; i < len ; i ++)
   {
    Crc(buf[i]);
   }
  }

  

 }
}

posted on 2004-12-27 14:24 用心(Canny) 阅读(7104) 评论(9) 编辑 收藏

评论

#1楼 2005-03-13 19:23 zlx
temp =(ushort)(temp ^(uppercrctab[(h-1)+1] ^ lowercrctab[(l -1)+ 1]));

这里为什么减1,又要加1
不懂呵!请赐教哦?

 回复 引用   

#2楼 2005-03-13 19:40 zlx
到那里看您的回复呢?!
 回复 引用   

#3楼[楼主] 2005-03-18 09:15 用心(Canny)      
我不知道你指的是哪个的 +1 -1 ,请说明!!
 回复 引用 查看   

这个效验结果好像有错误
 回复 引用   

#5楼[楼主] 2005-11-27 01:17 用心(Canny)      
不可能,我们的系统一直在用,可能调用的时候还是要注意的!不知道你是怎么调用的!
 回复 引用 查看   

#6楼 2005-11-30 10:46 zxd[未注册用户]
这个是通过什么接口返回结果呢?
还有“FF FE 20 01 00 00 00”的验算后的校验码是多少呢?
谢谢

 回复 引用   

#7楼 2005-12-16 17:01 fasd[未注册用户]
hao
 回复 引用   

#8楼 2006-01-29 22:28 110[未注册用户]
不错,接下了可以学学
 回复 引用   

应该怎么调用?在一个类中实例一个crc16,然后传入一个byte[6],结果是错的,为什么?
 回复 引用