Saltar al contenido

Cómo generar un CRC-16 desde C#

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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *