<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CRC &#8211; Sanity Free Coding</title>
	<atom:link href="http://sanity-free.org/tag/crc/feed" rel="self" type="application/rss+xml" />
	<link>http://sanity-free.org</link>
	<description>Methods to the Madness</description>
	<lastBuildDate>Wed, 29 Oct 2025 00:52:57 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>http://sanity-free.org/wp-content/uploads/2025/10/sanity-free-512-150x150.jpg</url>
	<title>CRC &#8211; Sanity Free Coding</title>
	<link>http://sanity-free.org</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>A Standard CRC-16 and CRC-16 Kermit implementation in C#</title>
		<link>http://sanity-free.org/standard_crc16_and_crc16_kermit_implementation_in_csharp.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Fri, 27 Jul 2012 18:00:00 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[CRC]]></category>
		<category><![CDATA[CRC16]]></category>
		<category><![CDATA[CRC16-CCITT]]></category>
		<category><![CDATA[CRC16-CCITT Kermit]]></category>
		<category><![CDATA[CRC32]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=243</guid>

					<description><![CDATA[Been a while since I posted anything, but here&#8217;s an update to my original CRC-16 class that does CRC-16 with CRC-CCITT Kermit code that I posted over on Stack Overflow a while ago. Unlike the code over there this doesn&#8217;t have a static look-up table (feel free to get the code from over there if [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Been a while since I posted anything, but here&#8217;s an update to my <a href="/standard_crc_16_in_csharp.html">original CRC-16</a> class that does CRC-16 with CRC-CCITT Kermit code that I posted over on <a href="http://stackoverflow.com/questions/5059268/c-sharp-crc-implementation" target="_blank" rel="noreferrer noopener">Stack Overflow</a> a while ago. Unlike the code over there this doesn&#8217;t have a static look-up table (feel free to get the code from over there if you wanted the static table, but I&#8217;m actually not too fond of static look-up tables on example source code though they are more efficient).<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>using System;

public enum Crc16Mode : ushort { Standard = 0xA001, CcittKermit = 0x8408 }

public class Crc16 {
    readonly ushort[] table = new ushort&#91;256&#93;;

    public ushort ComputeChecksum( params byte[] bytes ) {
        ushort crc = 0;
        for(int i = 0; i &lt; bytes.Length; ++i) {
            byte index = (byte)(crc ^ bytes&#91;i&#93;);
            crc = (ushort)((crc >> 8) ^ table&#91;index&#93;);
        }
        return crc;
    }

    public byte[] ComputeChecksumBytes( params byte[] bytes ) {
        ushort crc = ComputeChecksum( bytes );
        return BitConverter.GetBytes( crc );
    }

    public Crc16( Crc16Mode mode ) {
        ushort polynomial = (ushort)mode;
        ushort value;
        ushort temp;
        for(ushort i = 0; i &lt; table.Length; ++i) {
            value = 0;
            temp = i;
            for(byte j = 0; j &lt; 8; ++j) {
                if(((value ^ temp) &amp; 0x0001) != 0) {
                    value = (ushort)((value >> 1) ^ polynomial);
                }else {
                    value >>= 1;
                }
                temp >>= 1;
            }
            table&#91;i&#93; = value;
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">enum</span><span style="color: #000000"> </span><span style="color: #267F99">Crc16Mode</span><span style="color: #000000"> : </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> { </span><span style="color: #001080">Standard</span><span style="color: #000000"> = </span><span style="color: #098658">0xA001</span><span style="color: #000000">, </span><span style="color: #001080">CcittKermit</span><span style="color: #000000"> = </span><span style="color: #098658">0x8408</span><span style="color: #000000"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Crc16</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">readonly</span><span style="color: #000000"> </span><span style="color: #0000FF">ushort</span><span style="color: #000000">[] </span><span style="color: #001080">table</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #0000FF">ushort</span><span style="color: #000000">&#91;</span><span style="color: #098658">256</span><span style="color: #000000">&#93;;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">( </span><span style="color: #0000FF">params</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">bytes</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #001080">bytes</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">; ++</span><span style="color: #001080">i</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">index</span><span style="color: #000000"> = (</span><span style="color: #0000FF">byte</span><span style="color: #000000">)(</span><span style="color: #001080">crc</span><span style="color: #000000"> ^ </span><span style="color: #001080">bytes</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93;);</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">crc</span><span style="color: #000000"> = (</span><span style="color: #0000FF">ushort</span><span style="color: #000000">)((</span><span style="color: #001080">crc</span><span style="color: #000000"> &gt;&gt; </span><span style="color: #098658">8</span><span style="color: #000000">) ^ </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">index</span><span style="color: #000000">&#93;);</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #795E26">ComputeChecksumBytes</span><span style="color: #000000">( </span><span style="color: #0000FF">params</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">bytes</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">( </span><span style="color: #001080">bytes</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">BitConverter</span><span style="color: #000000">.</span><span style="color: #795E26">GetBytes</span><span style="color: #000000">( </span><span style="color: #001080">crc</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #795E26">Crc16</span><span style="color: #000000">( </span><span style="color: #267F99">Crc16Mode</span><span style="color: #000000"> </span><span style="color: #001080">mode</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">polynomial</span><span style="color: #000000"> = (</span><span style="color: #0000FF">ushort</span><span style="color: #000000">)</span><span style="color: #001080">mode</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #001080">table</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">; ++</span><span style="color: #001080">i</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">value</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">temp</span><span style="color: #000000"> = </span><span style="color: #001080">i</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">j</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">j</span><span style="color: #000000"> &lt; </span><span style="color: #098658">8</span><span style="color: #000000">; ++</span><span style="color: #001080">j</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">(((</span><span style="color: #001080">value</span><span style="color: #000000"> ^ </span><span style="color: #001080">temp</span><span style="color: #000000">) &amp; </span><span style="color: #098658">0x0001</span><span style="color: #000000">) != </span><span style="color: #098658">0</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">value</span><span style="color: #000000"> = (</span><span style="color: #0000FF">ushort</span><span style="color: #000000">)((</span><span style="color: #001080">value</span><span style="color: #000000"> &gt;&gt; </span><span style="color: #098658">1</span><span style="color: #000000">) ^ </span><span style="color: #001080">polynomial</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                }</span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">value</span><span style="color: #000000"> &gt;&gt;= </span><span style="color: #098658">1</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">temp</span><span style="color: #000000"> &gt;&gt;= </span><span style="color: #098658">1</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93; = </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>If you need for this code to be CLS compliant, you can change the method signature&#8217;s return type from ushort to int and it will operate the same (the <code>ushort</code> crc value will be implicitly converted from <code>ushort</code> to <code>int</code>)<br><br><strong>Links to the other C# CRC implementations</strong> <a href="/standard_crc_16_in_csharp.html">the original CRC-16 implementation</a>, <a href="/crc_16_ccitt_in_csharp.html">CRC16-CCITT</a>, <a href="/crc32_implementation_in_csharp.html">CRC-32</a>, and <a href="/crc8_implementation_in_csharp.html">CRC-8</a><br><br>I&#8217;ve consolidated all of these into a single library on <a href="https://github.com/nullfx/NullFX.CRC" target="_blank" rel="noreferrer noopener">GitHub here: NullFX.CRC</a>.<br><br>I&#8217;m also very into Swift at the moment and have created Swift versions of these same classes and released a Swift PM version of this library here as well <a href="https://github.com/nullfx/NullfxCrc" target="_blank" rel="noreferrer noopener">Swift NullfxCrc Package</a></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A CRC8 implementation in C#</title>
		<link>http://sanity-free.org/crc8_implementation_in_csharp.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Wed, 03 Feb 2010 18:00:00 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[CRC]]></category>
		<category><![CDATA[CRC16]]></category>
		<category><![CDATA[CRC16-CCITT]]></category>
		<category><![CDATA[CRC16-CCITT Kermit]]></category>
		<category><![CDATA[CRC32]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=238</guid>

					<description><![CDATA[So I&#8217;ve tackled CRC32, CRC16, CRC16-CCITT (and now CRC16-CCITT Kermit) implementations, and found myself wanting a CRC8 class to create checksums for small data (1-2 bytes) sets. Not having ever used or seen CRC8 in use before, I did some reading, and as far as I can tell, I&#8217;ve implemented it correctly&#8230; It works anyway, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>So I&#8217;ve tackled <a href="/crc32_implementation_in_csharp.html">CRC32</a>, <a href="/standard_crc_16_in_csharp.html">CRC16</a>, <a href="/crc_16_ccitt_in_csharp.html">CRC16-CCITT</a> (and now <a href="/standard_crc16_and_crc16_kermit_implementation_in_csharp.html">CRC16-CCITT Kermit</a>) implementations, and found myself wanting a CRC8 class to create checksums for small data (1-2 bytes) sets. Not having ever used or seen CRC8 in use before, I did some reading, and as far as I can tell, I&#8217;ve implemented it correctly&#8230; It works anyway, so without further ado, here&#8217;s my implementation:<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public static class Crc8 {
    static byte[] table = new byte&#91;256&#93;;
    // x8 + x7 + x6 + x4 + x2 + 1
    const byte poly = 0xd5;

    public static byte ComputeChecksum(params byte[] bytes ) {
        byte crc = 0;
        if ( bytes != null &amp;&amp; bytes.Length > 0 ) {
            foreach ( byte b in bytes ) {
                crc = table&#91;crc ^ b&#93;;
            }
        }
        return crc;
    } 

    static Crc8( ) {
        for ( int i = 0; i &lt; 256; ++i ) {
            int temp = i;
            for ( int j = 0; j &lt; 8; ++j ) {
                if ( ( temp &amp; 0x80 ) != 0 ) {
                    temp = ( temp &lt;&lt; 1 ) ^ poly;
                } else {
                    temp &lt;&lt;= 1;
                }
            }
            table&#91;i&#93; = (byte)temp;
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Crc8</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">table</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">&#91;</span><span style="color: #098658">256</span><span style="color: #000000">&#93;;</span></span>
<span class="line"><span style="color: #008000">    // x8 + x7 + x6 + x4 + x2 + 1</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">const</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">poly</span><span style="color: #000000"> = </span><span style="color: #098658">0xd5</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">(</span><span style="color: #0000FF">params</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">bytes</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">bytes</span><span style="color: #000000"> != </span><span style="color: #0000FF">null</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">bytes</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000"> &gt; </span><span style="color: #098658">0</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">foreach</span><span style="color: #000000"> ( </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">b</span><span style="color: #000000"> </span><span style="color: #AF00DB">in</span><span style="color: #000000"> </span><span style="color: #001080">bytes</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">crc</span><span style="color: #000000"> ^ </span><span style="color: #001080">b</span><span style="color: #000000">&#93;;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    } </span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #795E26">Crc8</span><span style="color: #000000">( ) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">for</span><span style="color: #000000"> ( </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #098658">256</span><span style="color: #000000">; ++</span><span style="color: #001080">i</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000"> = </span><span style="color: #001080">i</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">for</span><span style="color: #000000"> ( </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">j</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">j</span><span style="color: #000000"> &lt; </span><span style="color: #098658">8</span><span style="color: #000000">; ++</span><span style="color: #001080">j</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( ( </span><span style="color: #001080">temp</span><span style="color: #000000"> &amp; </span><span style="color: #098658">0x80</span><span style="color: #000000"> ) != </span><span style="color: #098658">0</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">temp</span><span style="color: #000000"> = ( </span><span style="color: #001080">temp</span><span style="color: #000000"> &lt;&lt; </span><span style="color: #098658">1</span><span style="color: #000000"> ) ^ </span><span style="color: #001080">poly</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">temp</span><span style="color: #000000"> &lt;&lt;= </span><span style="color: #098658">1</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93; = (</span><span style="color: #0000FF">byte</span><span style="color: #000000">)</span><span style="color: #001080">temp</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>This one differs slightly (API wise) from my previous ones, mainly because I was using it for check-summing smaller bits of data, so I made the <code>ComputeChecksum</code> method a params argument instead of a first class array type.<br><br>Here&#8217;s a sample of how I was using it (and testing it):</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>byte crc = Crc8.ComputeChecksum( 1, 2, 3 );
byte check = Crc8.ComputeChecksum( 1, 2, 3, crc );
// here check should equal 0 to show that the checksum is accurate
if ( check != 0 ) {
    Console.WriteLine( "Error in the checksum" );
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #001080">Crc8</span><span style="color: #000000">.</span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">( </span><span style="color: #098658">1</span><span style="color: #000000">, </span><span style="color: #098658">2</span><span style="color: #000000">, </span><span style="color: #098658">3</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">check</span><span style="color: #000000"> = </span><span style="color: #001080">Crc8</span><span style="color: #000000">.</span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">( </span><span style="color: #098658">1</span><span style="color: #000000">, </span><span style="color: #098658">2</span><span style="color: #000000">, </span><span style="color: #098658">3</span><span style="color: #000000">, </span><span style="color: #001080">crc</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #008000">// here check should equal 0 to show that the checksum is accurate</span></span>
<span class="line"><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">check</span><span style="color: #000000"> != </span><span style="color: #098658">0</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #001080">Console</span><span style="color: #000000">.</span><span style="color: #795E26">WriteLine</span><span style="color: #000000">( </span><span style="color: #A31515">&quot;Error in the checksum&quot;</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>I&#8217;ve consolidated all of these into a single library on <a href="https://github.com/nullfx/NullFX.CRC" target="_blank" rel="noreferrer noopener">GitHub here: NullFX.CRC</a>.<br><br>I&#8217;m also very into Swift at the moment and have created Swift versions of these same classes and released a Swift PM version of this library here as well <a href="https://github.com/nullfx/NullfxCrc" target="_blank" rel="noreferrer noopener">Swift NullfxCrc Package</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Standard CRC 16 in C#</title>
		<link>http://sanity-free.org/standard_crc_16_in_csharp.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Thu, 14 Dec 2006 18:00:57 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[CRC]]></category>
		<category><![CDATA[CRC16]]></category>
		<category><![CDATA[CRC16-CCITT]]></category>
		<category><![CDATA[CRC16-CCITT Kermit]]></category>
		<category><![CDATA[CRC32]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=217</guid>

					<description><![CDATA[I&#8217;ve been working on a service at work that will end up being this big cluster of servers that all talk with each other.&#160; One of the things I needed was a small CRC checksum for some of the more compact UDP messages that get sent around.&#160; I thought about just using the CRC16-CCITT library [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>I&#8217;ve been working on a service at work that will end up being this big cluster of servers that all talk with each other.&nbsp; One of the things I needed was a small CRC checksum for some of the more compact UDP messages that get sent around.&nbsp; I thought about just using the CRC16-CCITT library I already had, but decided on using the standard CRC16 algorithm.&nbsp; Since I posted the CRC32 and CRC16-CCITT implementations I thought I&#8217;d post this one too.<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>using System;

public class Crc16 {
    const ushort polynomial = 0xA001;
    ushort[] table = new ushort&#91;256&#93;;

    public ushort ComputeChecksum(byte[] bytes) {
        ushort crc = 0;
        for(int i = 0; i &lt; bytes.Length; ++i) {
            byte index = (byte)(crc ^ bytes&#91;i&#93;);
            crc = (ushort)((crc >> 8) ^ table&#91;index&#93;);
        }
        return crc;
    }

    public byte[] ComputeChecksumBytes(byte[] bytes) {
        ushort crc = ComputeChecksum(bytes);
        return BitConverter.GetBytes(crc);
    }

    public Crc16() {
        ushort value;
        ushort temp;
        for(ushort i = 0; i &lt; table.Length; ++i) {
            value = 0;
            temp = i;
            for(byte j = 0; j &lt; 8; ++j) {
                if(((value ^ temp) &amp; 0x0001) != 0) {
                    value = (ushort)((value >> 1) ^ polynomial);
                }else {
                    value >>= 1;
                }
                temp >>= 1;
            }
            table&#91;i&#93; = value;
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Crc16</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">const</span><span style="color: #000000"> </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">polynomial</span><span style="color: #000000"> = </span><span style="color: #098658">0xA001</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">ushort</span><span style="color: #000000">[] </span><span style="color: #001080">table</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #0000FF">ushort</span><span style="color: #000000">&#91;</span><span style="color: #098658">256</span><span style="color: #000000">&#93;;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">(</span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">bytes</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #001080">bytes</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">; ++</span><span style="color: #001080">i</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">index</span><span style="color: #000000"> = (</span><span style="color: #0000FF">byte</span><span style="color: #000000">)(</span><span style="color: #001080">crc</span><span style="color: #000000"> ^ </span><span style="color: #001080">bytes</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93;);</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">crc</span><span style="color: #000000"> = (</span><span style="color: #0000FF">ushort</span><span style="color: #000000">)((</span><span style="color: #001080">crc</span><span style="color: #000000"> &gt;&gt; </span><span style="color: #098658">8</span><span style="color: #000000">) ^ </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">index</span><span style="color: #000000">&#93;);</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #795E26">ComputeChecksumBytes</span><span style="color: #000000">(</span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">bytes</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">(</span><span style="color: #001080">bytes</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">BitConverter</span><span style="color: #000000">.</span><span style="color: #795E26">GetBytes</span><span style="color: #000000">(</span><span style="color: #001080">crc</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #795E26">Crc16</span><span style="color: #000000">() {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #001080">table</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">; ++</span><span style="color: #001080">i</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">value</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">temp</span><span style="color: #000000"> = </span><span style="color: #001080">i</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">j</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">j</span><span style="color: #000000"> &lt; </span><span style="color: #098658">8</span><span style="color: #000000">; ++</span><span style="color: #001080">j</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">(((</span><span style="color: #001080">value</span><span style="color: #000000"> ^ </span><span style="color: #001080">temp</span><span style="color: #000000">) &amp; </span><span style="color: #098658">0x0001</span><span style="color: #000000">) != </span><span style="color: #098658">0</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">value</span><span style="color: #000000"> = (</span><span style="color: #0000FF">ushort</span><span style="color: #000000">)((</span><span style="color: #001080">value</span><span style="color: #000000"> &gt;&gt; </span><span style="color: #098658">1</span><span style="color: #000000">) ^ </span><span style="color: #001080">polynomial</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                }</span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">value</span><span style="color: #000000"> &gt;&gt;= </span><span style="color: #098658">1</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">temp</span><span style="color: #000000"> &gt;&gt;= </span><span style="color: #098658">1</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93; = </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>If you need for this code to be CLS compliant, you can change the method signature&#8217;s return type from <code>ushort</code> to <code>int</code> and it will operate the same (the <code>ushort</code> CRC value will be implicitly converted from <code>ushort</code> to <code>int</code>)<br><br><strong>Links to the other C# CRC implementations</strong> <a href="/crc_16_ccitt_in_csharp.html">CRC16-CCITT</a>, <a href="/standard_crc16_and_crc16_kermit_implementation_in_csharp.html">CRC16-CCITT Kermit</a>, <a href="/crc32_implementation_in_csharp.html">CRC32</a>, and <a href="/crc8_implementation_in_csharp.html">CRC8</a><br><br>I&#8217;ve consolidated all of these into a single library on <a href="https://github.com/nullfx/NullFX.CRC" target="_blank" rel="noreferrer noopener">GitHub here: NullFX.CRC</a>.<br><br>I&#8217;m also very into Swift at the moment and have created Swift versions of these same classes and released a Swift PM version of this library here as well <a href="https://github.com/nullfx/NullfxCrc" target="_blank" rel="noreferrer noopener">Swift NullfxCrc Package</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>CRC 16 CCITT in C#</title>
		<link>http://sanity-free.org/crc_16_ccitt_in_csharp.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Tue, 07 Nov 2006 18:00:43 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[CRC]]></category>
		<category><![CDATA[CRC16]]></category>
		<category><![CDATA[CRC16-CCITT]]></category>
		<category><![CDATA[CRC16-CCITT Kermit]]></category>
		<category><![CDATA[CRC32]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=211</guid>

					<description><![CDATA[Once again I found myself needing another type of CRC algorithm in C#. I found one on code project, but their implementation of CRC 16 CCITT didn&#8217;t produce that checksum I needed. Come to find out there are different methods to calculate CRC 16 CCITT which use different initial values for the CRC. I ended [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Once again I found myself needing another type of CRC algorithm in C#. I found one on code project, but their implementation of CRC 16 CCITT didn&#8217;t produce that checksum I needed. Come to find out there are different methods to calculate CRC 16 CCITT which use different initial values for the CRC.<br><br>I ended up writing this one for my own purposes:<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>using System;

public enum InitialCrcValue { Zeros, NonZero1 = 0xffff, NonZero2 = 0x1D0F }

public class Crc16Ccitt {
    const ushort poly = 4129;
    ushort[] table = new ushort&#91;256&#93;;
    ushort initialValue = 0;

    public ushort ComputeChecksum(byte[] bytes) {
        ushort crc = this.initialValue;
        for(int i = 0; i &lt; bytes.Length; ++i) {
            crc = (ushort)((crc &lt;&lt; 8) ^ table[((crc >> 8) ^ (0xff &amp; bytes&#91;i&#93;))]);
        }
        return crc;
    }

    public byte[] ComputeChecksumBytes(byte[] bytes) {
        ushort crc = ComputeChecksum(bytes);
        return BitConverter.GetBytes(crc);
    }

    public Crc16Ccitt(InitialCrcValue initialValue) {
        this.initialValue = (ushort)initialValue;
        ushort temp, a;
        for(int i = 0; i &lt; table.Length; ++i) {
            temp = 0;
            a = (ushort)(i &lt;&lt; 8);
            for(int j = 0; j &lt; 8; ++j) {
                if(((temp ^ a) &amp; 0x8000) != 0) {
                    temp = (ushort)((temp &lt;&lt; 1) ^ poly);
                } else {
                    temp &lt;&lt;= 1;
                }
                a &lt;&lt;= 1;
            }
            table&#91;i&#93; = temp;
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">enum</span><span style="color: #000000"> </span><span style="color: #267F99">InitialCrcValue</span><span style="color: #000000"> { </span><span style="color: #001080">Zeros</span><span style="color: #000000">, </span><span style="color: #001080">NonZero1</span><span style="color: #000000"> = </span><span style="color: #098658">0xffff</span><span style="color: #000000">, </span><span style="color: #001080">NonZero2</span><span style="color: #000000"> = </span><span style="color: #098658">0x1D0F</span><span style="color: #000000"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Crc16Ccitt</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">const</span><span style="color: #000000"> </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">poly</span><span style="color: #000000"> = </span><span style="color: #098658">4129</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">ushort</span><span style="color: #000000">[] </span><span style="color: #001080">table</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #0000FF">ushort</span><span style="color: #000000">&#91;</span><span style="color: #098658">256</span><span style="color: #000000">&#93;;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">initialValue</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">(</span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">bytes</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #0000FF">this</span><span style="color: #000000">.</span><span style="color: #001080">initialValue</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #001080">bytes</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">; ++</span><span style="color: #001080">i</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">crc</span><span style="color: #000000"> = (</span><span style="color: #0000FF">ushort</span><span style="color: #000000">)((</span><span style="color: #001080">crc</span><span style="color: #000000"> &lt;&lt; </span><span style="color: #098658">8</span><span style="color: #000000">) ^ </span><span style="color: #001080">table</span><span style="color: #000000">[((</span><span style="color: #001080">crc</span><span style="color: #000000"> &gt;&gt; </span><span style="color: #098658">8</span><span style="color: #000000">) ^ (</span><span style="color: #098658">0xff</span><span style="color: #000000"> &amp; </span><span style="color: #001080">bytes</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93;))]);</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #795E26">ComputeChecksumBytes</span><span style="color: #000000">(</span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">bytes</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">(</span><span style="color: #001080">bytes</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">BitConverter</span><span style="color: #000000">.</span><span style="color: #795E26">GetBytes</span><span style="color: #000000">(</span><span style="color: #001080">crc</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #795E26">Crc16Ccitt</span><span style="color: #000000">(</span><span style="color: #267F99">InitialCrcValue</span><span style="color: #000000"> </span><span style="color: #001080">initialValue</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">this</span><span style="color: #000000">.</span><span style="color: #001080">initialValue</span><span style="color: #000000"> = (</span><span style="color: #0000FF">ushort</span><span style="color: #000000">)</span><span style="color: #001080">initialValue</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">ushort</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000">, </span><span style="color: #001080">a</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #001080">table</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">; ++</span><span style="color: #001080">i</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">temp</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">a</span><span style="color: #000000"> = (</span><span style="color: #0000FF">ushort</span><span style="color: #000000">)(</span><span style="color: #001080">i</span><span style="color: #000000"> &lt;&lt; </span><span style="color: #098658">8</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">j</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">j</span><span style="color: #000000"> &lt; </span><span style="color: #098658">8</span><span style="color: #000000">; ++</span><span style="color: #001080">j</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">(((</span><span style="color: #001080">temp</span><span style="color: #000000"> ^ </span><span style="color: #001080">a</span><span style="color: #000000">) &amp; </span><span style="color: #098658">0x8000</span><span style="color: #000000">) != </span><span style="color: #098658">0</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">temp</span><span style="color: #000000"> = (</span><span style="color: #0000FF">ushort</span><span style="color: #000000">)((</span><span style="color: #001080">temp</span><span style="color: #000000"> &lt;&lt; </span><span style="color: #098658">1</span><span style="color: #000000">) ^ </span><span style="color: #001080">poly</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">temp</span><span style="color: #000000"> &lt;&lt;= </span><span style="color: #098658">1</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">a</span><span style="color: #000000"> &lt;&lt;= </span><span style="color: #098658">1</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93; = </span><span style="color: #001080">temp</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>This was used for testing during the time we were looking at the Battlefield 2142 auth token, and were trying to figure out what the last 2 bytes of that token were made of.  Battlefield 2142&#8217;s auth token uses the CRC 16 CCITT with the initial value of 0 <code>new Crc16Ccitt(InitialCrcValue.Zeros</code>) in the above class. <br><br>If you need for this code to be CLS compliant, you can change the method signature&#8217;s return type from <code>ushort</code> to <code>int</code> and it will operate the same (the <code>ushort</code> crc value will be implicitly converted from <code>ushort</code> to <code>int</code>)<br><br><strong>Links to the other C# CRC implementations</strong> <a href="/crc32_implementation_in_csharp.html">CRC32</a>, <a href="/standard_crc_16_in_csharp.html">CRC16</a>, <a href="/standard_crc16_and_crc16_kermit_implementation_in_csharp.html">CRC16-CCITT Kermit</a>, and <a href="/crc8_implementation_in_csharp.html">CRC8</a><br><br>I&#8217;ve consolidated all of these into a single library on <a href="https://github.com/nullfx/NullFX.CRC" target="_blank" rel="noreferrer noopener">GitHub here: NullFX.CRC</a>.<br><br>I&#8217;m also very into Swift at the moment and have created Swift versions of these same classes and released a Swift PM version of this library here as well <a href="https://github.com/nullfx/NullfxCrc" target="_blank" rel="noreferrer noopener">Swift NullfxCrc Package</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A CRC32 Implementation in C#</title>
		<link>http://sanity-free.org/crc32_implementation_in_csharp.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Mon, 02 May 2005 18:00:27 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[CRC]]></category>
		<category><![CDATA[CRC16]]></category>
		<category><![CDATA[CRC16-CCITT]]></category>
		<category><![CDATA[CRC16-CCITT Kermit]]></category>
		<category><![CDATA[CRC32]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=35</guid>

					<description><![CDATA[The other day I was looking for a simple CRC32 library&#8230; I couldn&#8217;t find one (that suited my needs) so I wrote a quick and dirty implementation. here it is: Its admittedly small, and hardly anyone uses CRC32 for security purposes (at least I hope not), but it is a decent checksum generator for small [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>The other day I was looking for a simple CRC32 library&#8230;<br><br>I couldn&#8217;t find one (that suited my needs) so I wrote a quick and dirty implementation.<br><br>here it is:<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>namespace NullFX.Security {
    using System;
    public class Crc32 {
        uint[] table;

        public uint ComputeChecksum(byte[] bytes) {
            uint crc = 0xffffffff;
            for(int i = 0; i &lt; bytes.Length; ++i) {
                byte index = (byte)(((crc) &amp; 0xff) ^ bytes&#91;i&#93;);
                crc = (uint)((crc >> 8) ^ table&#91;index&#93;);
            }
            return ~crc;
        }

        public byte[] ComputeChecksumBytes(byte[] bytes) {
            return BitConverter.GetBytes(ComputeChecksum(bytes));
        }

        public Crc32() {
            uint poly = 0xedb88320;
            table = new uint&#91;256&#93;;
            uint temp = 0;
            for(uint i = 0; i &lt; table.Length; ++i) {
                temp = i;
                for(int j = 8; j > 0; --j) {
                    if((temp &amp; 1) == 1) {
                        temp = (uint)((temp >> 1) ^ poly);
                    }else {
                        temp >>= 1;
                    }
                }
                table&#91;i&#93; = temp;
            }
        }
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">namespace</span><span style="color: #000000"> </span><span style="color: #267F99">NullFX</span><span style="color: #000000">.</span><span style="color: #267F99">Security</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Crc32</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">uint</span><span style="color: #000000">[] </span><span style="color: #001080">table</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">(</span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">bytes</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">crc</span><span style="color: #000000"> = </span><span style="color: #098658">0xffffffff</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #001080">bytes</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">; ++</span><span style="color: #001080">i</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">index</span><span style="color: #000000"> = (</span><span style="color: #0000FF">byte</span><span style="color: #000000">)(((</span><span style="color: #001080">crc</span><span style="color: #000000">) &amp; </span><span style="color: #098658">0xff</span><span style="color: #000000">) ^ </span><span style="color: #001080">bytes</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93;);</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">crc</span><span style="color: #000000"> = (</span><span style="color: #0000FF">uint</span><span style="color: #000000">)((</span><span style="color: #001080">crc</span><span style="color: #000000"> &gt;&gt; </span><span style="color: #098658">8</span><span style="color: #000000">) ^ </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">index</span><span style="color: #000000">&#93;);</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> ~</span><span style="color: #001080">crc</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #795E26">ComputeChecksumBytes</span><span style="color: #000000">(</span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">bytes</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">BitConverter</span><span style="color: #000000">.</span><span style="color: #795E26">GetBytes</span><span style="color: #000000">(</span><span style="color: #795E26">ComputeChecksum</span><span style="color: #000000">(</span><span style="color: #001080">bytes</span><span style="color: #000000">));</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #795E26">Crc32</span><span style="color: #000000">() {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">poly</span><span style="color: #000000"> = </span><span style="color: #098658">0xedb88320</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">table</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #0000FF">uint</span><span style="color: #000000">&#91;</span><span style="color: #098658">256</span><span style="color: #000000">&#93;;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">temp</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #001080">table</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">; ++</span><span style="color: #001080">i</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">temp</span><span style="color: #000000"> = </span><span style="color: #001080">i</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">j</span><span style="color: #000000"> = </span><span style="color: #098658">8</span><span style="color: #000000">; </span><span style="color: #001080">j</span><span style="color: #000000"> &gt; </span><span style="color: #098658">0</span><span style="color: #000000">; --</span><span style="color: #001080">j</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">if</span><span style="color: #000000">((</span><span style="color: #001080">temp</span><span style="color: #000000"> &amp; </span><span style="color: #098658">1</span><span style="color: #000000">) == </span><span style="color: #098658">1</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #001080">temp</span><span style="color: #000000"> = (</span><span style="color: #0000FF">uint</span><span style="color: #000000">)((</span><span style="color: #001080">temp</span><span style="color: #000000"> &gt;&gt; </span><span style="color: #098658">1</span><span style="color: #000000">) ^ </span><span style="color: #001080">poly</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                    }</span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #001080">temp</span><span style="color: #000000"> &gt;&gt;= </span><span style="color: #098658">1</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    }</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">table</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93; = </span><span style="color: #001080">temp</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span>
<span class="line"></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>Its admittedly small, and hardly anyone uses CRC32 for security purposes (at least I hope not), but it is a decent checksum generator for small non-critical items.<br><br>I needed a 32 bit sized number generator&#8211;I was implementing my own <code>object.GetHashCode()</code> and wanted to get an int hashcode for my own objects&#8211;and this seemed like a decent way to do it.<br><br>If you need for this code to be CLS compliant, you can change the method signature&#8217;s return type from uint to long and it will operate the same (the uint crc value will be implicitly converted from uint to long)<br><br><strong>Links to the other C# CRC implementations</strong> <a href="/crc_16_ccitt_in_csharp.html">CRC16-CCITT</a>, <a href="/standard_crc16_and_crc16_kermit_implementation_in_csharp.html">CRC16-CCITT Kermit</a>, <a href="/standard_crc_16_in_csharp.html">CRC16</a>, and <a href="/crc8_implementation_in_csharp.html" target="_blank" rel="noreferrer noopener">CR</a><a href="/crc8_implementation_in_csharp.html">C</a><a href="/crc8_implementation_in_csharp.html" target="_blank" rel="noreferrer noopener">8</a><br><br>I&#8217;ve consolidated all of these into a single library on <a href="https://github.com/nullfx/NullFX.CRC" target="_blank" rel="noreferrer noopener">GitHub here: NullFX.CRC</a>.<br><br>I&#8217;m also very into Swift at the moment and have created Swift versions of these same classes and released a Swift PM version of this library here as well <a href="https://github.com/nullfx/NullfxCrc" target="_blank" rel="noreferrer noopener">Swift NullfxCrc Package</a></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
