如何计算 string 的 crc32 值 ?

咨询区

  • Nick Berardi

请问我如何通过 C# 计算 string 的 crc32 校验和?

回答区

  • Pete

我一直震撼的一件事就是 .NET 底层框架中居然没有提供对 CRC32 的直接支持,CRC32 一直都是 ZIP,RAR 压缩中做校验和的绝佳方案,在 .NET 中你可以这么使用。

var crc32 = new Crc32();
var hash = String.Empty;using (var 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);

更详细的资料可参考:https://damieng.com/blog/2006/08/08/calculating_crc32_in_c_and_net 和 https://github.com/damieng/DamienGKit/blob/master/CSharp/DamienG.Library/Security/Cryptography/Crc32.cs

  • SharpC

上面朋友的回答是基于 File 的方式,其实替换成 string 会更加直接,方便,我的项目中定义了一个 Crc32 帮助类,代码如下:

/// <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/ 以在线的方式来测试你的 crc32 的输入输出。

点评区

两位大佬提供的方式不错,学习了,最后的 Online :https://crccalc.com/ 太方便了,有兴趣可以尝试一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark ML - 聚类算法

http://ihoge.cn/2018/ML2.html Spark ML - 聚类算法 1.KMeans快速聚类 首先到UR需要的包&#xff1a; import org.apache.spark.ml.clustering.{KMeans,KMeansModel} import org.apache.spark.ml.linalg.Vectors 开启RDD的隐式转换&#xff1a; import spark.implicits.…

twitter storm源码走读(五)

TridentTopology创建过程详解 从用户层面来看TridentTopology&#xff0c;有两个重要的概念一是Stream,另一个是作用于Stream上的各种Operation。在实现层面来看&#xff0c;无论是stream&#xff0c;还是后续的operation都会转变成为各个Node&#xff0c;这些Node之间的关系通…

C语言宏使用常见问题

代码&#xff1a; #include<stdio.h> #define MAX(a,b) a>b?a:b #define MIN(a,b) a>b?b:a //#define M (xY) #define M1(m) m*m #define M2(m) (m)*(m) #define M3(m) ((m)*(m)) int main(){int x,y,max,min;printf("Input one numbers:");int sum, m…

ad域管理与维护_AD域管理员账号下发

大家好&#xff0c;最近比较忙&#xff0c;好久没发文章了&#xff0c;这次继续讲AD域的相关内容。AD域运行在Windows Server服务器&#xff0c;用于集中管理网内的所有Windows客户端主机&#xff0c;其中最重要的管理手段便是「域组策略」&#xff0c;可管理的条目非常多&…

[Unity 游戏设计的元素]

1.核心游戏机制 2.主题 3.功能集合 4.可能的附加功能 5.备用主题创意转载于:https://www.cnblogs.com/rayshen/p/3968294.html

路遥工具箱全面迁移至 .NET 6.0 并发布 3.0 版本及迁移记录详解

随着 .NET 6.0 的发布 NewLife 组件也进行了升级&#xff0c;并在 2022 年 1 月份全面停止了对 .NET Framework 的支持框架依赖升级至 .NET Standard 2.1 。2022 年新年到来之际&#xff0c;笔者也打算将路遥工具箱全面迁移至 .NET 6.0 同时发布 3.0 版本。这意味着路遥工具箱将…

java中main函数解析

作者&#xff1a;xwdreamer出处&#xff1a;http://www.cnblogs.com/xwdreamer欢迎任何形式的转载&#xff0c;但请务必注明出处。从写java至今&#xff0c;写的最多的可能就是主函数 public static void main(String[] args) {} 但是以前一直都没有问自己&#xff0c;为什么要…

逻辑回归算法原理

http://ihoge.cn/2018/LR.html 逻辑回归模型 逻辑回归也被称为对数几率回归&#xff0c;算法名虽然叫做逻辑回归&#xff0c;但是该算法是分类算法&#xff0c;个人认为这是因为逻辑回归用了和回归类似的方法来解决了分类问题。 逻辑回归模型是一种分类模型&#xff0c;用条…

.net core入门之web应用

2019独角兽企业重金招聘Python工程师标准>>> 其实铺垫了那么久&#xff0c;终于到重点了&#xff0c;迫不及待了吧&#xff0c;那么我们用重量级工具Visual Studio 2015&#xff0c;安装Update3&#xff0c; 安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2.exe&…

python里split_python中split()的用法

原博文 2018-10-19 15:15 − Python split() 通过指定分隔符对字符串进行切片&#xff0c;如果参数 num 有指定值&#xff0c;则仅分隔 num 个子字符串。 语法&#xff1a; str.split(str"", numstring.count(str)) str -- 分隔符&#xff0c;默认为所有的空字符&…

C语言条件编译

假如现在要开发一个C语言程序&#xff0c;让它输出红色的文字&#xff0c;并且要求跨平台&#xff0c;在 Windows 和 Linux 下都能运行&#xff0c;怎么办呢&#xff1f;这个程序的难点在于&#xff0c;不同平台下控制文字颜色的代码不一样&#xff0c;我们必须要能够识别出不同…

设计模式之-命令模式(Command Pattern)

命令模式&#xff08;Command Pattern&#xff09;是用来实现在一个请求 - 响应模型松耦合。在命令模式中&#xff0c;请求被发送给调用者和调用它传递给被封装的命令对象。 Command对象将请求传递到接收器的适当的方法来执行特定操作。客户端程序创建接收器对象&#xff0c;然…

android -上传文件到服务器

android上传文件到服务器 重点:最好是设置好content-type这些参数的配置&#xff01; package com.spring.sky.image.upload.network; import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.Inp…

梯度下降法、随机梯度下降法、批量梯度下降法及牛顿法、拟牛顿法、共轭梯度法

http://ihoge.cn/2018/GradientDescent.html http://ihoge.cn/2018/newton1.html 引言 李航老师在《统计学习方法》中将机器学习的三要素总结为&#xff1a;模型、策略和算法。其大致含义如下&#xff1a; 模型&#xff1a;其实就是机器学习训练的过程中所要学习的条件概率…

浅谈.NET 6 中 gRPC 的最新功能

gRPC 是一个现代的、跨平台的、高性能的 RPC 框架。gRPC 是构建在 ASP.NET Core 之上&#xff0c;也是我们推荐的使用 .NET 构建 RPC 服务的方法。.NET 6 进一步提高了 gRPC 已经非常出色的性能&#xff0c;并添加了一系列新功能&#xff0c;使 gRPC 在现代云原生应用程序中比以…

如果你没有时间读书,至少要保留这个习惯

全世界只有3.14 % 的人关注了爆炸吧知识快节奏的生活中&#xff0c;如何花费少量的时间&#xff0c;就可以让自己的生活发生好的改变&#xff1f;知乎上有一个高赞回答&#xff1a;大量阅读优质文章。见识决定了你的眼界&#xff0c;站得越高&#xff0c;看得越多&#xff0c;你…

python引入模块时import与from ... import的区别

import datetime是引入整个datetime包&#xff0c;如果使用datetime包中的datetime类,需要加上模块名的限定。 1 import datetime 2 3 print datetime.datetime.now() 如果不加模块名限定会出现错误&#xff1a;TypeError: module object is not callable \ AttributeError: m…

基于python的随机森林回归实现_随机森林理论与python代码实现

1,初品随机森林 随机森林&#xff0c;森林就是很多决策树放在一起一起叫森林&#xff0c;而随机体现在数据集的随机采样中和特征的随机选取中&#xff0c;具体下面再讲。通俗的说随机森林就是建立多颗决策树&#xff08;CART&#xff09;&#xff0c;来做分类&#xff08;回归&…