您的位置:首页 > 编程语言 > C#

庆祝开通blog,同时记下C#中如何进行CRC校验与浮点数的转换

2007-02-14 11:47 405 查看
  源于CSDN
[align=left]CRC 校验算法C#实现一 ——接口实现 [/align]
[align=left]CRC 校验有 CRC 8位 16位 32位所以在实现这些校验算发之前,先实现它们的接口!

using System; [/align]
[align=left]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); [/align]
[align=left] }
} [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]CRC 校验算法C#实现三 ——16位校验算法 [/align]
[align=left]using System;[/align]
[align=left]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
   }; [/align]
[align=left]  /// <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 [/align]
[align=left]  ushort crc = 0;[/align]
[align=left]  /// <summary>
  /// 校验后的结果
  /// </summary>
  public long Value
  {
   get
   {
    return crc;
   }
   set
   {
    crc = (ushort)value;
   }
  } [/align]
[align=left]  /// <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;
  } [/align]
[align=left]
  /// <summary>
  /// Crc16
  /// </summary>
  /// <param name="buffer"></param>
  public void Crc(byte[] buffer)
  {
   Crc(buffer,0,buffer.Length);
  } [/align]
[align=left]  /// <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]);
   }
  } [/align]
[align=left]  [/align]
[align=left] }
} [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
调用CRC16 的一个例子
[align=left]   
   [/align]
[align=left]CRC16 crc = new CRC16();
            crc.Reset();
            crc.Crc(buf,0,DataPack.NextPackDataByteCount - 2);
            crc.Crc(0);
            crc.Crc(0);
            buf[DataPack.NextPackDataByteCount - 2] = (byte)((crc.Value >> 8) & 0xff);
            buf[DataPack.NextPackDataByteCount - 1] = (byte)((crc.Value & 0xff));[/align]
 

FLOAT_HEX  HEX_FLOAT

float vDouble =77.79F;
   Text = BitConverter.ToString(BitConverter.GetBytes(vDouble)).Replace("-", " ");

string m=Text.Replace(" ", "");//如果中间有空格

int len = m.Length/2;
   

 
  byte[] arr = new byte[len];
  for(int i=0;i<len;i++)
  {
    arr[i] = Convert.ToByte(m.Substring(i*2,2),16);
  }
  float f1 = BitConverter.ToSingle(arr,0);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# blog byte float buffer 算法