如何计算 string 的 crc32 值 ?
生活随笔
收集整理的這篇文章主要介紹了
如何计算 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/ 太方便了,有興趣可以嘗試一下。
總結
以上是生活随笔為你收集整理的如何计算 string 的 crc32 值 ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Autofac实现有条件的DI
- 下一篇: 路遥工具箱全面迁移至 .NET 6.0