咨询区

  • 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/ 太方便了,有兴趣可以尝试一下。

如何计算 string 的 crc32 值 ?相关推荐

  1. java.lang.date_无法将java.lang.String类型的值转换为必需类型java.util.Date

    from date: to date: Trouver 这是控制器代码部分: @RequestParam(name = "d1", defaultValue = "190 ...

  2. crc32函数python,python求crc32值的方法

    本文实例讲述了python求crc32值的方法.分享给大家供大家参考.具体实现方法如下: 要想求CRC值,前面要import binascii binascii.crc32(v) 求出了v的crc32 ...

  3. java crc计算_Java对文件CRC32值计算

    * CRC生成 * * 区分 责任人 日期 说明 * 创建 周柏成 2016年4月10日 * @author zhou-baicheng * @email json@sojson.com * @ver ...

  4. 纯perl语言计算文件的crc32值

    perl语言有次强大的正则表达式功能,因而我喜欢使用perl语言进行一些数据分析,在项目中也需要生成文件的crc值,在网上很多都是引用第三方的库进行计算,crc计算是使用位计算得来,因此可以通过纯pe ...

  5. C#中有关数组和string引用类型或值类型的判断

    直接来一段测试代码 class value_ref_type{public static void DEMO1(){double[] location = new double[2] { 1.2565 ...

  6. android获取string.xml的值(转)

    为什么需要把应用中出现的文字单独存放在string.xml文件中呢? 一:是为了国际化,当需要国际化时,只需要再提供一个string.xml文件,把里面的汉子信息都修改为对应的语言(如,English ...

  7. jfinal获取url链接上面传来的string类型的值_每个公司都会用的短 URL 服务,怎么设计与实现?...

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...

  8. Java中string字符串的值_Java中的字符串(String)

    一.基本概念: 字符串是一系列字符串的序列.在Java语言中字符串是用一对对双引号"",括起来的字符系列.例如"Hello","你好".从数 ...

  9. android获取string.xml的值

    为什么需要把应用中出现的文字单独存放在string.xml文件中呢? 一:是为了国际化,当需要国际化时,只需要再提供一个string.xml文件,把里面的汉子信息都修改为对应的语言(如,English ...

最新文章

  1. 如何在nuget上传自己的包+搭建自己公司的NuGet服务器(新方法)
  2. 使用Jsonp实现跨域请求
  3. C# 多线程并发锁模式-总结
  4. Lotus Notes应用经验谈
  5. php是否直接支持函数的重载,php函数重载的替代方法--伪重载详解
  6. cuDNN兼容性问题造成的caffe/mnist,py-faster-rcnn/demo运行结果错误
  7. 【简洁写法】剑指 Offer 30. 包含min函数的栈
  8. MassTransit - .NET Core 的分布式应用程序框架
  9. 使用日志审计查看MaxCompute执行过哪些操作
  10. ios 请求失败封装_vue_axios请求封装、异常拦截统一处理
  11. 为什么VS提示SurfFeatureDetector不是cv的成员函数
  12. python3.6.5安装pip_无法在Python3.6中pip安装pickle
  13. 漫威女性电影背后所体现出来的性别观念转变
  14. 什么是PID控制中的超调
  15. Tool之synergyc:synergyc的简介、安装、使用方法(鼠标键盘控制两台或多台电脑)之详细攻略
  16. addrule android用法,RelativeLayout.LayoutParams 使用addRule失效的问题解决办法
  17. python儿童-少儿Python创意编程课
  18. 立创EDA---PCB
  19. 运维工程师主要是做什么的?和网络工程师有啥区别?
  20. UML 之 UML中的关系

热门文章

  1. Java IO流读取/写入/修改某个字符串(通用)
  2. 使用Css截取字符串
  3. 基于ip tunnel连接不同三个不同网络的×××
  4. oracle10g异常日志查看
  5. session机制和cookie机制
  6. Linux主机名那点事儿
  7. that is why用法
  8. Cordova入门系列(三)Cordova插件调用 转发 https://www.cnblogs.com/lishuxue/p/6018416.html...
  9. 4. ZooKeeper 基本操作
  10. 理解Go Interface