有人用C#写过CRC校验么,给段代码好么,急用

解决方案 »

  1.   

    using System;
    using System.IO;namespace Loyee.IO
    {
        /// <summary>
        /// Encapsulates a <see cref="System.IO.Stream" /> to calculate the CRC32 checksum on-the-fly as data passes through.
        /// </summary>
        public class CrcStream : Stream
        {
            /// <summary>
            /// Encapsulate a <see cref="System.IO.Stream" />.
            /// </summary>
            /// <param name="stream">The stream to calculate the checksum for.</param>
            public CrcStream(Stream stream)
            {
                this.stream = stream;
            }        Stream stream;        /// <summary>
            /// Gets the underlying stream.
            /// </summary>
            public Stream Stream
            {
                get { return stream; }
            }        public override bool CanRead
            {
                get { return stream.CanRead; }
            }        public override bool CanSeek
            {
                get { return stream.CanSeek; }
            }        public override bool CanWrite
            {
                get { return stream.CanWrite; }
            }        public override void Flush()
            {
                stream.Flush();
            }        public override long Length
            {
                get { return stream.Length; }
            }        public override long Position
            {
                get
                {
                    return stream.Position;
                }
                set
                {
                    stream.Position = value;
                }
            }        public override long Seek(long offset, SeekOrigin origin)
            {
                return stream.Seek(offset, origin);
            }        public override void SetLength(long value)
            {
                stream.SetLength(value);
            }        public override int Read(byte[] buffer, int offset, int count)
            {
                count = stream.Read(buffer, offset, count);
                readCrc = CalculateCrc(readCrc, buffer, offset, count);
                return count;
            }        public override void Write(byte[] buffer, int offset, int count)
            {
                stream.Write(buffer, offset, count);            writeCrc = CalculateCrc(writeCrc, buffer, offset, count);
            }        uint CalculateCrc(uint crc, byte[] buffer, int offset, int count)
            {
                unchecked
                {
                    for (int i = offset, end = offset + count; i < end; i++)
                        crc = (crc >> 8) ^ table[(crc ^ buffer[i]) & 0xFF];
                }
                return crc;
            }        static private uint[] table = GenerateTable();        static private uint[] GenerateTable()
            {
                unchecked
                {
                    uint[] table = new uint[256];                uint crc;
                    const uint poly = 0xEDB88320;
                    for (uint i = 0; i < table.Length; i++)
                    {
                        crc = i;
                        for (int j = 8; j > 0; j--)
                        {
                            if ((crc & 1) == 1)
                                crc = (crc >> 1) ^ poly;
                            else
                                crc >>= 1;
                        }
                        table[i] = crc;
                    }                return table;
                }        }        uint readCrc = unchecked(0xFFFFFFFF);        /// <summary>
            /// Gets the CRC checksum of the data that was read by the stream thus far.
            /// </summary>
            public uint ReadCrc
            {
                get { return unchecked(readCrc ^ 0xFFFFFFFF); }
            }        uint writeCrc = unchecked(0xFFFFFFFF);        /// <summary>
            /// Gets the CRC checksum of the data that was written to the stream thus far.
            /// </summary>
            public uint WriteCrc
            {
                get { return unchecked(writeCrc ^ 0xFFFFFFFF); }
            }        /// <summary>
            /// Resets the read and write checksums.
            /// </summary>
            public void ResetChecksum()
            {
                readCrc = unchecked(0xFFFFFFFF);
                writeCrc = unchecked(0xFFFFFFFF);
            }        /// <summary>
            /// 获取文件的 CRC 校验码
            /// </summary>
            /// <param name="file"></param>
            /// <returns></returns>
            public static uint GetFileCRC(string file)
            {
                using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    CrcStream crcStream = new CrcStream(fs);
                    StreamReader reader = new StreamReader(crcStream);
                    reader.ReadToEnd();                return crcStream.ReadCrc;
                }
            }
        }
    }
      

  2.   

    直接调用 public static uint GetFileCRC(string file) 方法即可获得文件的CRC校验码
      

  3.   

    这是8位的using System;namespace CRC 

     /// <summary> 
     /// CRC8 的摘要说明。 
     /// </summary> 
     public class CRC8:ICRC 
     { 
      #region CRC 8 位校验表   /// <summary> 
      /// CRC 8 位校验表 
      /// </summary> 
      public  byte[] CRC8_Table = new byte[] 
      { 
       0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65, 
       157,195,33,127,252,162,64,30, 95,1,227,189,62,96,130,220, 
       35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98, 
       190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255, 
       70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,             
       219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154, 
       101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,                         
       248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,             
       140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205, 
       17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80, 
       175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238, 
       50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115, 
       202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139, 
       87,9,235,181,54,104,138,212,149,203, 41,119,244,170,72,22, 
       233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168, 
       116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53 
      }; 
      #endregion   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]); 
       } 
      } 
     } 
    } using System;namespace CRC 

     /// <summary> 
     /// CRC8 的摘要说明。 
     /// </summary> 
     public class CRC8:ICRC 
     { 
      #region CRC 8 位校验表   /// <summary> 
      /// CRC 8 位校验表 
      /// </summary> 
      public  byte[] CRC8_Table = new byte[] 
      { 
       0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65, 
       157,195,33,127,252,162,64,30, 95,1,227,189,62,96,130,220, 
       35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98, 
       190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255, 
       70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,             
       219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154, 
       101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,                         
       248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,             
       140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205, 
       17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80, 
       175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238, 
       50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115, 
       202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139, 
       87,9,235,181,54,104,138,212,149,203, 41,119,244,170,72,22, 
       233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168, 
       116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53 
      }; 
      #endregion   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]); 
       } 
      } 
     } 

      

  4.   

    raozhiven(朗屹) 给的是16位的么
      

  5.   

    为什么要贴代码?
    ZipSharpLib 库是开源的,里面就有CRC校验元代码,直接拿来用不就行了?
      

  6.   

    ICRC 是什么类,我这里怎么找不到
      

  7.   

    CRC算法成千上万种 楼主说的是哪种?
    如果是CRC8的话,google上搜一大片,肯定比在这里问来得高效
      

  8.   

    这么复杂啊  看小弟的
    //校验crc16
    public static bool check(byte[] buff,int index,int len)
    {  //buff是待校验数组,index为起始索引,len为校验长度
    //buff是待校验数组,index为起始索引,len为校验长度
    uint i,j;
    byte h,l;
    byte c,d;
    h=0x55;
    l=0xaa;
    for(i=(uint)index;i<index+len;i++)
    {
    h=(byte)(buff[i]^h);
    for(j=0;j<8;j++)
    {
    c=(byte)(l&0x80);
    l<<=1;
    d=(byte)(h&0x80);
    h<<=1;
    if(c!=0)
    h|=0x01;
    if(d!=0)
    {
    //
    h =(byte)(h ^ 0x10);
    l = (byte)(l ^ 0x21);
    }
    }
    }
    if ( (h==0) && (l==0) )
    return true;
    else
    return  false;
    }//计算crc8验证码
    public static byte CRC8(byte[] putb,int index,int length)
    {
    //putb是输入的数组,index为起始索引,length为校验长度
    if(putb==null)
    throw new ArgumentNullException("byte[] putin");
    if(index<0||length<0||index+length>putb.Length)
    throw new ArgumentOutOfRangeException();
    byte outbt=0;
    //计算CRC8码
    for(int i=index;i<length+index;i++)
    outbt+=putb[i];
    return outbt;
    }