CRC 校验值

using System;
using System.Collections.Generic;
using System.Text;

namespace Test
{
class CRC
{
///


/// 得到一个byte数组的CRC校验值
///

/// byte数组
/// CRC校验值
public static int GetKey(byte[] data)
{
int count = data.Length;

byte[] buffer = new byte[data.Length + 2];

data.CopyTo(buffer, 0);

int ptr = 0;
int i = 0;
int crc = 0;
byte crc1, crc2, crc3;

crc1 = buffer[ptr++];
crc2 = buffer[ptr++];

buffer[count] = 0;
buffer[count + 1] = 0;

while (--count >= 0)
{
crc3 = buffer[ptr++];

for (i = 0; i < 8; i++)
{
if (((crc1 & 0x80) >> 7) == 1) //判断crc1高位是否为1
{
crc1 = (byte)(crc1 << 1); //移出高位

if (((crc2 & 0x80) >> 7) == 1) //判断crc2高位是否为1
{
crc1 = (byte)(crc1 | 0x01); //crc1低位由0变1
}

crc2 = (byte)(crc2 << 1); //crc2移出高位

if (((crc3 & 0x80) >> 7) == 1) //判断crc3高位是否为1
{
crc2 = (byte)(crc2 | 0x01); //crc2低位由0变1
}

crc3 = (byte)(crc3 << 1); //crc3移出高位

crc1 = (byte)(crc1 ^ 0x10);

crc2 = (byte)(crc2 ^ 0x21);
}
else
{
crc1 = (byte)(crc1 << 1); //移出高位

if (((crc2 & 0x80) >> 7) == 1) //判断crc2高位是否为1
{
crc1 = (byte)(crc1 | 0x01); //crc1低位由0变1
}

crc2 = (byte)(crc2 << 1); //crc2移出高位

if (((crc3 & 0x80) >> 7) == 1) //判断crc3高位是否为1
{
crc2 = (byte)(crc2 | 0x01); //crc2低位由0变1
}

crc3 = (byte)(crc3 << 1); //crc3移出高位
}
}
}

crc = (int)((crc1 << 8) + crc2);

return crc;
}

}
}

posted @ 2007-08-17 17:33  Yoshow  阅读(1085)  评论(0编辑  收藏  举报