Si hallas alguna incompatibilidad con tu código o trabajo, recuerda probar siempre en un entorno de testing antes subir el código al proyecto final.
Solución:
Aquí vamos; tenga en cuenta que este es un sabor específico de CRC-16 – es confuso decir simplemente “CRC-16”. Esto toma prestados algunos detalles de implementación de http://www.sanity-free.com/ – tenga en cuenta que lo he hecho static
en lugar de basado en instancias.
using System;
static class Program
static void Main()
string input = "8000";
var bytes = HexToBytes(input);
string hex = Crc16.ComputeChecksum(bytes).ToString("x2");
Console.WriteLine(hex); //c061
static byte[] HexToBytes(string input)
byte[] result = new byte[input.Length / 2];
for(int i = 0; i < result.Length; i++)
result[i] = Convert.ToByte(input.Substring(2 * i, 2), 16);
return result;
public static class Crc16
const ushort polynomial = 0xA001;
static readonly ushort[] table = new ushort[256];
public static ushort ComputeChecksum(byte[] bytes)
ushort crc = 0;
for (int i = 0; i < bytes.Length; ++i)
byte index = (byte)(crc ^ bytes[i]);
crc = (ushort)((crc >> 8) ^ table[index]);
return crc;
static Crc16()
ushort value;
ushort temp;
for (ushort i = 0; i < table.Length; ++i)
value = 0;
temp = i;
for (byte j = 0; j < 8; ++j)
if (((value ^ temp) & 0x0001) != 0)
value = (ushort)((value >> 1) ^ polynomial);
else
value >>= 1;
temp >>= 1;
table[i] = value;
Además, si quieres CRC16-CCITT.
private ushort Crc16Ccitt(byte[] bytes)
const ushort poly = 4129;
ushort[] table = new ushort[256];
ushort initialValue = 0xffff;
ushort temp, a;
ushort crc = initialValue;
for (int i = 0; i < table.Length; ++i)
temp = 0;
a = (ushort)(i << 8);
for (int j = 0; j < 8; ++j)
if (((temp ^ a) & 0x8000) != 0)
temp = (ushort)((temp << 1) ^ poly);
else
temp <<= 1;
a <<= 1;
table[i] = temp;
for (int i = 0; i < bytes.Length; ++i)
crc = (ushort)((crc << 8) ^ table[((crc >> 8) ^ (0xff & bytes[i]))]);
return crc;
Comentarios y puntuaciones de la guía
Recuerda algo, que tienes la capacidad de agregar una reseña .
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)