Saltar al contenido

¿Cómo calculo CRC32 de un string

Nuestro grupo de expertos despúes de días de investigación y recopilar de datos, obtuvimos la solución, esperamos que todo este artículo sea de utilidad en tu plan.

Solución:

Este chico parece tener tu respuesta.

https://damieng.com/blog/2006/08/08/calculating_crc32_in_c_and_net

Y en caso de que el blog desaparezca o rompa la URL, aquí está el enlace de github:

https://github.com/damieng/DamienGKit/blob/master/CSharp/DamienG.Library/Security/Cryptography/Crc32.cs


Uso de la clase Crc32 de la publicación del blog:

Crc32 crc32 = new Crc32();
String hash = String.Empty;

using (FileStream fs = File.Open("c:\myfile.txt", FileMode.Open))
  foreach (byte b in crc32.ComputeHash(fs)) hash += b.ToString("x2").ToLower();

Console.WriteLine("CRC-32 is 0", hash);

Dado que parece estar buscando calcular el CRC32 de un string (en lugar de un archivo) hay un buen ejemplo aquí: https://rosettacode.org/wiki/CRC-32#C.23

El código en caso de que alguna vez desaparezca:

/// 
/// Performs 32-bit reversed cyclic redundancy checks.
/// 
public class Crc32

    #region Constants
    /// 
    /// Generator polynomial (modulo 2) for the reversed CRC32 algorithm. 
    /// 
    private const UInt32 s_generator = 0xEDB88320;
    #endregion

    #region Constructors
    /// 
    /// Creates a new instance of the Crc32 class.
    /// 
    public Crc32()
    
        // Constructs the checksum lookup table. Used to optimize the checksum.
        m_checksumTable = Enumerable.Range(0, 256).Select(i =>
        
            var tableEntry = (uint)i;
            for (var j = 0; j < 8; ++j)
            
                tableEntry = ((tableEntry & 1) != 0)
                    ? (s_generator ^ (tableEntry >> 1)) 
                    : (tableEntry >> 1);
            
            return tableEntry;
        ).ToArray();
    
    #endregion

    #region Methods
    /// 
    /// Calculates the checksum of the byte stream.
    /// 
    /// The byte stream to calculate the checksum for.
    /// A 32-bit reversed checksum.
    public UInt32 Get(IEnumerable byteStream)
    
        try
        
            // Initialize checksumRegister to 0xFFFFFFFF and calculate the checksum.
            return ~byteStream.Aggregate(0xFFFFFFFF, (checksumRegister, currentByte) => 
                      (m_checksumTable[(checksumRegister & 0xFF) ^ Convert.ToByte(currentByte)] ^ (checksumRegister >> 8)));
        
        catch (FormatException e)
        
            throw new CrcException("Could not read the stream out as bytes.", e);
        
        catch (InvalidCastException e)
        
            throw new CrcException("Could not read the stream out as bytes.", e);
        
        catch (OverflowException e)
        
            throw new CrcException("Could not read the stream out as bytes.", e);
        
    
    #endregion

    #region Fields
    /// 
    /// Contains a cache of calculated checksum chunks.
    /// 
    private readonly UInt32[] m_checksumTable;

    #endregion

y para usarlo:

var arrayOfBytes = Encoding.ASCII.GetBytes("The quick brown fox jumps over the lazy dog");

var crc32 = new Crc32();
Console.WriteLine(crc32.Get(arrayOfBytes).ToString("X"));

Puede probar los valores de entrada/salida aquí: https://crccalc.com/

Reseñas y valoraciones del tutorial

Si te animas, tienes la libertad de dejar una reseña acerca de qué te ha parecido este escrito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

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