using System;
public class CRC16
{
private static readonly ushort[] crc16Table = new ushort[256];
static CRC16()
{
// 初始化CRC16表
for (ushort i = 0; i < 256; i++)
{
ushort crc = 0;
ushort c = i;
for (int j = 0; j < 8; j++)
{
if (((crc ^ c) & 0x0001) != 0)
{
crc = (ushort)((crc >> 1) ^ 0xA001);
}
else
{
crc >>= 1;
}
c >>= 1;
}
crc16Table[i] = crc;
}
}
public static ushort ComputeChecksum(byte[] bytes)
{
ushort crc = 0xFFFF;
foreach (byte b in bytes)
{
crc = (ushort)((crc >> 8) ^ crc16Table[(crc ^ b) & 0xFF]);
}
return crc;
}
public static byte[] ComputeChecksumBytes(byte[] bytes)
{
ushort crc = ComputeChecksum(bytes);
return new byte[] { (byte)(crc & 0xFF), (byte)(crc >> 8) };
}
}
// 示例用法
class Program
{
static void Main()
{
byte[] data = { 0x01, 0x02, 0x03, 0x04, 0x05 };
ushort checksum = CRC16.ComputeChecksum(data);
Console.WriteLine($"CRC16 Checksum: {checksum:X4}");
byte[] checksumBytes = CRC16.ComputeChecksumBytes(data);
Console.WriteLine($"CRC16 Checksum Bytes: {BitConverter.ToString(checksumBytes)}");
}
}
CRC16表初始化:在静态构造函数中,我们初始化了一个CRC16查找表 (crc16Table
)。这个表用于加速CRC计算,避免每次计算时都进行复杂的位运算。
ComputeChecksum方法:该方法接收一个字节数组,并返回一个16位的CRC校验值。它使用预先计算好的CRC16表来快速计算校验值。
ComputeChecksumBytes方法:该方法将计算出的16位CRC校验值拆分为两个字节,并返回一个包含这两个字节的数组。
示例用法:在Main
方法中,我们定义了一个字节数组 data
,然后调用ComputeChecksum
和ComputeChecksumBytes
方法来计算并打印CRC16校验值及其字节表示形式。
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站