⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crc-ccitt -- 16-bit.htm

📁 CRC16的源程序
💻 HTM
📖 第 1 页 / 共 4 页
字号:
  <TR>
    <TD><TT>Conversion of the binary value above to hexadecimal by segmenting 
      the bits to nibbles:</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      binary nibbles&nbsp;&nbsp; 1001 0100 0111 1001</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      hexadecimal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      9&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp; 
  9</TT></TD></TR></TBODY></TABLE>
<P>
<HR width="100%">

<H3><A name=source></A>Source Code for the C-language Implementations</H3>&nbsp; 

<TABLE cols=1 width="100%" border=1>
  <TBODY>
  <TR>
    <TD><TT>/*</TT> <BR><TT>demonstrates how the incorrect check value of 
      0x29B1 may be reported</TT> <BR><TT>for the test string "123456789" when 
      it should be 0xE5CC.</TT> <BR><TT>*/</TT> 
      <P><TT>#include &lt;stdio.h&gt;</TT> <BR><TT>#include 
      &lt;string.h&gt;</TT> 
      <P><TT>#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      poly&nbsp;&nbsp;&nbsp;&nbsp; 
      0x1021&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* crc-ccitt 
      mask */</TT> 
      <P><TT>/* global variables */</TT> <BR><TT>char text[1000];</TT> 
      <BR><TT>unsigned short good_crc;</TT> <BR><TT>unsigned short bad_crc;</TT> 
      <BR><TT>unsigned short text_length;</TT> 
      <P><TT>int main(void)</TT> <BR><TT>{</TT> <BR><TT>&nbsp;&nbsp;&nbsp; void 
      go();</TT> <BR><TT>&nbsp;&nbsp;&nbsp; void repeat_character(unsigned char, 
      unsigned short);</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp; sprintf(text, "%s", "");</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; go();</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp; sprintf(text, "%s", "A");</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; go();</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp; sprintf(text, "%s", "123456789");</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; go();</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp; repeat_character(65, 256);</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; go();</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp; return 0;</TT> <BR><TT>}</TT> 
      <P><TT>void go(void)</TT> <BR><TT>{</TT> <BR><TT>&nbsp;&nbsp;&nbsp; void 
      update_good_crc(unsigned short);</TT> <BR><TT>&nbsp;&nbsp;&nbsp; void 
      augment_message_for_good_crc();</TT> <BR><TT>&nbsp;&nbsp;&nbsp; void 
      update_bad_crc(unsigned short);</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp; unsigned short ch, i;</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp; good_crc = 0xffff;</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; bad_crc = 0xffff;</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; i = 0;</TT> <BR><TT>&nbsp;&nbsp;&nbsp; 
      text_length= 0;</TT> <BR><TT>&nbsp;&nbsp;&nbsp; 
      while((ch=text[i])!=0)</TT> <BR><TT>&nbsp;&nbsp;&nbsp; {</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      update_good_crc(ch);</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      update_bad_crc(ch);</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text_length++;</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; }</TT> <BR><TT>&nbsp;&nbsp;&nbsp; 
      augment_message_for_good_crc();</TT> <BR><TT>&nbsp;&nbsp;&nbsp; 
      printf(</TT> <BR><TT>&nbsp;&nbsp;&nbsp; "\nGood_CRC = %04X,&nbsp; Bad_CRC 
      = %04X,&nbsp; Length = %u,&nbsp; Text = \"%s\"",</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      good_crc,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      bad_crc,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      text_length,&nbsp; text</TT> <BR><TT>&nbsp;&nbsp;&nbsp; );</TT> 
      <BR><TT>}</TT> 
      <P><TT>void repeat_character(unsigned char ch, unsigned short n)</TT> 
      <BR><TT>{</TT> <BR><TT>&nbsp;&nbsp;&nbsp; unsigned short i;</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; for (i=0; i&lt;n; i++)</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; {</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text[i] = ch;</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; }</TT> <BR><TT>&nbsp;&nbsp;&nbsp; text[n] = 
      0;</TT> <BR><TT>}</TT> 
      <P><TT>void update_good_crc(unsigned short ch)</TT> <BR><TT>{</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; unsigned short i, v, xor_flag;</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp; /*</TT> <BR><TT>&nbsp;&nbsp;&nbsp; Align test 
      bit with leftmost bit of the message byte.</TT> <BR><TT>&nbsp;&nbsp;&nbsp; 
      */</TT> <BR><TT>&nbsp;&nbsp;&nbsp; v = 0x80;</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp; for (i=0; i&lt;8; i++)</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; {</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (good_crc &amp; 
      0x8000)</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      xor_flag= 1;</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      }</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      xor_flag= 0;</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      }</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; good_crc = 
      good_crc &lt;&lt; 1;</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ch &amp; v)</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      /*</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      Append next bit of message to end of CRC if it is not zero.</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      The zero bit placed there by the shift above need not be</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      changed if the next bit of the message is zero.</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      */</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      good_crc= good_crc + 1;</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (xor_flag)</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      good_crc = good_crc ^ poly;</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Align test bit with 
      next bit of the message byte.</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v = v &gt;&gt; 1;</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; }</TT> <BR><TT>}</TT> 
      <P><TT>void augment_message_for_good_crc()</TT> <BR><TT>{</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; unsigned short i, xor_flag;</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp; for (i=0; i&lt;16; i++)</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; {</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (good_crc &amp; 
      0x8000)</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      xor_flag= 1;</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      }</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      xor_flag= 0;</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      }</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; good_crc = 
      good_crc &lt;&lt; 1;</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (xor_flag)</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      good_crc = good_crc ^ poly;</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; }</TT> <BR><TT>}</TT> 
      <P><TT>void update_bad_crc(unsigned short ch)</TT> <BR><TT>{</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; /* based on code found at</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; 
      http://www.programmingparadise.com/utility/crc.html</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; */</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp; unsigned short i, xor_flag;</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp; /*</TT> <BR><TT>&nbsp;&nbsp;&nbsp; Why are they 
      shifting this byte left by 8 bits??</TT> <BR><TT>&nbsp;&nbsp;&nbsp; How do 
      the low bits of the poly ever see it?</TT> <BR><TT>&nbsp;&nbsp;&nbsp; 
      */</TT> <BR><TT>&nbsp;&nbsp;&nbsp; ch&lt;&lt;=8;</TT> 
      <P><TT>&nbsp;&nbsp;&nbsp; for(i=0; i&lt;8; i++)</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp; {</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((bad_crc ^ ch) 
      &amp; 0x8000)</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      {</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      xor_flag = 1;</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      }</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      xor_flag = 0;</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      }</TT> <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bad_crc = 
      bad_crc &lt;&lt; 1;</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (xor_flag)</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      bad_crc = bad_crc ^ poly;</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</TT> 
      <BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = ch &lt;&lt; 
      1;</TT> <BR><TT>&nbsp;&nbsp;&nbsp; }</TT> 
<BR><TT>}</TT></P></TD></TR></TBODY></TABLE>
<P>
<HR width="100%">

<H3><A name=refs></A>References</H3>The following web page contains a javascript 
calculator that is handy for what-if comparisions in calculating various CRCs by 
slightly different methods and with any initial value -- very well done: 
<UL>
  <LI><A 
  href="http://rcswww.urz.tu-dresden.de/~sr21/crc.html">http://rcswww.urz.tu-dresden.de/~sr21/crc.html</A> 
  -- CRC calculation, by Sven Reifegerste. </LI></UL>
<P><BR>The following web pages were among those which were helpful in developing 
the text and program in this document: 
<UL>
  <LI><A 
  href="http://www.ross.net/crc/crcpaper.html">http://www.ross.net/crc/crcpaper.html</A> 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -