Lazy working,keep walking.

Rodin的学习日志

转载 CRC算法C#实现收藏

新一篇: 色彩模式转换函数

原文地址:

接口实现:http://www.cnblogs.com/canny/archive/2004/12/27/82466.aspx

CRC8:http://www.cnblogs.com/canny/archive/2004/12/27/82468.aspx

CRC16:http://www.cnblogs.com/canny/archive/2004/12/27/82470.aspx

CRC32:http://www.cnblogs.com/canny/archive/2004/12/27/82473.aspx

1.接口实现

CRC 校验有 CRC 8位 16位 32位 所以在实现这些校验算发之前,先实现它们的接口!

using System; 

namespace CRC 

 
public interface ICRC 
 

     
  
long Value 
  

    
get
  }
 
   
  
void Reset(); 
   
  
void Crc(int bval); 
   
  
void Crc(byte[] buffer); 
   
  
void Crc(byte[] buf, int off, int len); 

 }
 
}
 


2. CRC8

 

using System;

namespace CRC 

 
/// <summary> 
 
/// CRC8 的摘要说明。 
 
/// </summary> 

 public class CRC8:ICRC 
 

  
CRC 8 位校验表 

  
uint crc = 0
   
  
/// <summary> 
  
///返回 CRC8校验结果; 
  
/// </summary> 

  public long Value 
  

   
get 
   

    
return crc; 
   }
 
   
set 
   

    crc 
= (uint)value; 
   }
 
  }
 


  
/// <summary> 
  
/// CRC校验前设置校验值 
  
/// </summary> 

  public void Reset() 
  

   crc 
= 0
  }
 

  
/// <summary> 
  
/// 8 位 CRC 校验 产生校验码 需要被校验码和校验码 
  
/// </summary> 
  
/// <param name="CRC"></param> 
  
/// <param name="OldCRC"> 初始为 0 ,以后为 返回值 ret </param> 
  
/// <returns> 产生校验码时 ret 为校验码</returns> 

   
  
public void Crc(byte CRC,byte OldCRC) 
  

   crc 
= CRC8_Table[OldCRC ^ CRC]; 
  }
 

  
/// <summary> 
  
/// 8 位 CRC 校验 产生校验码 只要被校验码 
  
/// </summary> 
  
/// <param name="bval"></param> 

  public void Crc(int bval) 
  

   crc 
= CRC8_Table[crc ^ bval]; 
  }
 

  
/// <summary> 
  
/// 8 位 CRC 校验 产生校验码 只要被校验的字节数组 
  
/// </summary> 
  
/// <param name="buffer"></param> 

  public void Crc(byte[] buffer) 
  


   Crc(buffer,
0,buffer.Length); 
  }
 

  
/// <summary> 
  
/// 8 位 CRC 校验 产生校验码 要被校验的字节数组、起始结果位置和字节长度 
  
/// </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]); 
   }
 
  }
 
 }
 
}
 


3.CRC16

 

using System;

namespace CRC 

 
/// <summary> 
 
/// CRC16 的摘要说明。 
 
/// </summary> 

 public class CRC16:ICRC 
 

  
CRC 16 位校验表 

  
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); 
  }