有人用C#写过CRC校验么,给段代码好么,急用
解决方案 »
- 查找GridView里的模板列里的子控件问题?
- 关于lock的对象的问题
- socket传递对象(如类)效率问题,心跳时间间隔多少为宜。
- listview添加的时候默认是添加到最后,有办法添加到前面吗?
- 取时间问题。请大家帮帮忙!谢谢
- web service 的客户端访问问题?
- 以下的代码中的方括号是什么意思呢?像这样 [DefaultProperty("SelectCommand")],看不懂。
- 怎样将注册表二进制值直接读出为byte[]类型?
- sql中如何判断某一字段值存在数据表的某一字段中
- 用vs.net调试别人的程序,如不知道事件响应函数的位置,怎么快速找到,可以用调试的方法直接进入事件响应函数中并停留在首行吗?
- VS2003里winform关于AxWebBrowser怎么调用一个页面的方法.
- 请问一下如何取字节数组byte[]里面的具体位上的数进行处理呢??C#里有没有方法呢
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;
}
}
}
}
{
/// <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]);
}
}
}
}
ZipSharpLib 库是开源的,里面就有CRC校验元代码,直接拿来用不就行了?
如果是CRC8的话,google上搜一大片,肯定比在这里问来得高效
//校验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;
}