For a while now I had a selection of CRC algorithms in my library. It offered support for many CRC-8, CRC-16, and CRC-32 variants, all inheriting from a bit clunky HashAlgorithm
base class. It wasn't an ideal choice as hashes and checksums are different beasts but it did a job.
With .NET 7 out, we finally got NonCryptographicHashAlgorithm
base class to inherit from and that one is much better at dealing with CRC nuances. Adjustment of algorithms was easy enough but testing has shown one issue. Output of Microsoft's CRC-32 class and one I have created was exactly reversed. For example, if an input would resut in 0x1A2B3C4D
output from my class, Microsoft's class would return 0x4D3C2B1A
. Yep, we selected a different endianess.
I originally created my CRC classes with microcontroller communication in mind. Since most of microcontrollers are from the big-endian world, my classes were designed to output bytes in big-endian fashion. On other hand, Microsoft designed their CRC-32 class for communication on x86 platform. And that one is little-endian.
After giving it a lot of thought, I decided to go the Microsoft route and output result in native endianess if using GetCurrentHash
method from NonCryptographicHashAlgorithm
base class. Main reason was to have the same overall behavior whether someone uses my, Microsoft's, or any other class. That said, I my classes always had an "escape hatch" method that outputs a number (HashAsUInt32
) that can be then converted to any endianess.
In any case, if you need any CRC-8, CRC-16, or CRC-32 calculations with custom polynomials, do check out Medo.IO.Hashing library.