您的位置:程序门 -> .net技术 -> c#



crc校验码的使用


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


crc校验码的使用
发表于:2007-02-13 10:07:22 楼主
新手上路,传数据的时候,需要加一个crc校验码.

请问,怎么生成一个crc16的校验码,然后怎么去校验,希望能有点源代码以供参考,谢谢!
发表于:2007-02-13 10:21:061楼 得分:0
既不清楚了,
记得c做的时候是根据每个校验位进行操作,可能是&操作,
结果赋给第16位
校验的时候也是如此,看获得的结果和第16位的值是否相同
发表于:2007-02-13 10:23:302楼 得分:0
找到一个,但是太长了,这里贴不完。
   

发表于:2007-02-13 10:25:153楼 得分:0
http://www.ilib.cn/a-yysfxyxb200404012.html
发表于:2007-02-13 10:27:234楼 得分:0
using   system;
using   system.text;

public   sealed   class   crc32
{
public   const   int   table_size   =   256;

public   const   uint   standard_polynomial   =   0xedb88320;

private   crc32()
{
}

static   crc32()  
{
table   =   new   uint[table_size];
polynomial   =   standard_polynomial;
}

public   static   bool   initialized  
{
get   {   return   initialized;   }
}
[clscompliant(false)]
public   static   uint   polynomial  
{  
get   {   return   polynomial;   }
}

private   static   uint[]         table;
private   static   uint             polynomial;
private   static   bool             initialized;


public   static   void   init(uint   polynomial)  
{
polynomial   =   polynomial;
uint   i   =   0,   j   =   0;
uint   dwcrc   =   0;

for   (i   =   0;   i   <   table_size;   i++)  
{
dwcrc   =   i;
for   (j   =   8;   j   >   0;   j--)  
{
if   ((dwcrc   &   1)   !=   0)  
dwcrc   =   (dwcrc   > >   1)   ^   polynomial;
else
dwcrc   > > =   1;
}
table[i]   =   dwcrc;
}

initialized   =   true;
}

public   static   void   init(int   polynomial)  
{
byte[]   intbytes   =   bitconverter.getbytes(polynomial);
uint   poly   =   bitconverter.touint32(intbytes,   0);
init(poly);
}

public   static   void   init(long   polynomial)  
{
const   uint   mask   =   0xffffffff;
uint     poly   =   (uint)(polynomial   &   mask);
init(poly);
}

public   static   void   init()  
{
init(standard_polynomial);
}

public   static   byte[]   crc32(byte[]   data)  
{
if   (!initialized)
throw   new   invalidoperationexception(
"you   must   initialize   the   crc   table   before   attempting   to   calculate   the   check   on   data. ");

byte[]   crc32_result;
uint   _result   =   0,   len   =   (uint)unchecked(data.length);
uint   i   =   0;

const   uint   tableindexmask   =   0xff;

uint   dwcrc32   =   0xffffffff;
for   (i   =   0;   i   <   len;   i++)  
{
dwcrc32   =   (dwcrc32   > >   8)   ^   table[   (uint)data[i]   ^   (dwcrc32   &   tableindexmask)   ];
}

_result   =   dwcrc32   ^   0xffffffff;

crc32_result   =   bitconverter.getbytes(_result);
return   crc32_result;
}

public   static   unsafe   byte[]   crc32(byte   *pdata,   uint   dwlength)  
{
byte*   ptr   =   pdata;
byte[]   data   =   new   byte[dwlength];
for   (uint   i   =   0;   i   <   dwlength;   i++)  
{
data[i]   =   *ptr;
ptr++;
}

return   crc32(data);
}

public   static   byte[]   crc32(string   data)  
{
return   crc32(data,   encoding.ascii);
}

public   static   byte[]   crc32(string   data,   encoding   encoding)  
{
byte[]   encdata   =   encoding.getbytes(data);
return   crc32(encdata);
}
}

   

发表于:2007-02-13 11:01:095楼 得分:0
ding
发表于:2007-02-13 11:50:196楼 得分:0
ding
发表于:2007-02-13 11:55:067楼 得分:0
up
发表于:2007-02-13 17:20:258楼 得分:0
能给一个数据吗,比如我byte[]   crctest={1,0,0,1,0,1,0,1}这样用crc算出来的校验码应是多少?
我怎么才能确定算出来的数据是对的.
发表于:2007-02-13 17:41:079楼 得分:0
up
发表于:2007-02-14 11:39:2710楼 得分:0
能给一个数,然后给生成的校验码吗?我校验我的算出来对不对.
发表于:2007-02-14 11:49:4111楼 得分:0
byte[]   crctest={1,0,0,1,0,1,0,1}

-500323098(0xe22dace6)   //   crc32
17117(0x42dd)   //   crc16
发表于:2007-02-14 11:55:4112楼 得分:0
计算结果和cangwu_lee(橙子)一致
发表于:2007-02-14 13:09:5313楼 得分:0
up


快速检索

最新资讯
热门点击