Как рассчитать CRC32 строки

Как рассчитать CRC32 (контрольную сумму циклического избыточного кода) строки в .NET?

11.08.2008 19:41:20
2 ОТВЕТА
РЕШЕНИЕ

У этого парня, кажется, есть твой ответ.

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

И в случае, если блог пропадает или нарушает URL, вот ссылка на github:

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


Использование класса Crc32 из поста в блоге:

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);
33
6.07.2018 17:42:02
Хороший ответ и код по этой ссылке выглядит солидно. Спасибо, Пит!
Erick Brown 4.10.2014 21:01:37
Этот код сейчас сломан, казалось бы. У Crc32класса нет базового конструктора, который вызывает его пример кода.
im1dermike 28.08.2017 15:41:41
Существует пакет NuGet, который будет обрабатывать это для вас Install-Package Crc32.NET. Он фактически реализует алгоритм (и подразумевает, что он будет значительно быстрее, чем другие альтернативы). Вы можете запустить приведенную выше команду NuGet или найти источник на GitHub по адресу github.com/force-net/Crc32.NET . Я обычно не включаю зависимости для каждой мелочи, но это кажется специализированным и разумным.
Pete 29.08.2017 13:14:30

Поскольку вы, похоже, хотите рассчитать CRC32 для строки (а не файла), здесь есть хороший пример: https://rosettacode.org/wiki/CRC-32#C.23

Код должен когда-либо исчезнуть:

/// <summary>
/// Performs 32-bit reversed cyclic redundancy checks.
/// </summary>
public class Crc32
{
    #region Constants
    /// <summary>
    /// Generator polynomial (modulo 2) for the reversed CRC32 algorithm. 
    /// </summary>
    private const UInt32 s_generator = 0xEDB88320;
    #endregion

    #region Constructors
    /// <summary>
    /// Creates a new instance of the Crc32 class.
    /// </summary>
    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
    /// <summary>
    /// Calculates the checksum of the byte stream.
    /// </summary>
    /// <param name="byteStream">The byte stream to calculate the checksum for.</param>
    /// <returns>A 32-bit reversed checksum.</returns>
    public UInt32 Get<T>(IEnumerable<T> 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
    /// <summary>
    /// Contains a cache of calculated checksum chunks.
    /// </summary>
    private readonly UInt32[] m_checksumTable;

    #endregion
}

и использовать это:

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"));

Вы можете проверить значения ввода / вывода здесь: https://crccalc.com/

7
19.08.2018 22:01:10