如何计算字符串的CRC32

Nic*_*rdi 32 .net crc32

如何计算.NET中字符串的CRC32(循环冗余校验和)?

Pet*_*ete 32

这家伙似乎有你的答案.

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

如果博客消失或打破网址,这里是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);
Run Code Online (Sandbox Code Playgroud)

  • 有一个NuGet软件包将为您处理此问题。Install-Package Crc32.NET。它实际上实现了该算法(并且据称比其他方法要快得多)。您可以运行上面的NuGet命令或在GitHub上的源代码中找到https://github.com/force-net/Crc32.NET。通常,我不是为了包含所有小事情而使用依赖项,但这似乎是专门且合理的。 (3认同)

Sha*_*rpC 6

由于您似乎正在计算字符串(而不是文件)的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
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

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"));
Run Code Online (Sandbox Code Playgroud)

您可以在此处测试输入/输出值:https : //crccalc.com/


Kar*_* Jo 5

.NET 平台扩展支持 Crc32 。要使用它,您需要先安装nuget 包

要计算字符串的 Crc32,您需要将其转换为字节数组。使用哪种编码取决于字符串的来源:

var text = "target string";
var crc32 = new System.IO.Hashing.Crc32();
var bytes = Encoding.UTF8.GetBytes(text);
crc32.Append(bytes);
Run Code Online (Sandbox Code Playgroud)

计算结果默认为 Little Endian,如果需要转换为 Big Endian ,可以将结果数组反转:

var checkSum = crc32.GetCurrentHash();
// to Big Endian
Array.Reverse(checkSum);
Run Code Online (Sandbox Code Playgroud)

最后,输出可以是您需要的数字或十六进制:

// int
Console.WriteLine(BitConverter.ToInt32(checkSum));
// lowercase hex string
Console.WriteLine(BitConverter.ToString(checkSum).Replace("-", "").ToLower());
Run Code Online (Sandbox Code Playgroud)