CRC32/CRC16算法C#中的实现 - uusystem - 博客园
Excerpt
CRC32算法 CRC16算法 更多内容请访问 www.uusystem.com
CRC32算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| <span> 1</span> <span>using</span><span> System; </span><span> 2</span> <span>using</span><span> System.Collections.Generic; </span><span> 3</span> <span>using</span><span> System.Text; </span><span> 4</span> <span>using</span><span> System.IO; </span><span> 5</span> <span> 6</span> <span>namespace</span><span> GetCRC32 </span><span> 7</span> <span>{ </span><span> 8</span> <span>class</span><span> CRC32Cls </span><span> 9</span> <span> { </span><span>10</span> <span>protected</span> <span>ulong</span><span>[] Crc32Table; </span><span>11</span> <span>//</span><span>生成CRC32码表</span> <span>12</span> <span>public</span> <span>void</span><span> GetCRC32Table() </span><span>13</span> <span> { </span><span>14</span> <span>ulong</span><span> Crc; </span><span>15</span> Crc32Table = <span>new</span> <span>ulong</span>[<span>256</span><span>]; </span><span>16</span> <span>int</span><span> i,j; </span><span>17</span> <span>for</span>(i = <span>0</span>;i < <span>256</span>; i++<span>) </span><span>18</span> <span> { </span><span>19</span> Crc = (<span>ulong</span><span>)i; </span><span>20</span> <span>for</span> (j = <span>8</span>; j > <span>0</span>; j--<span>) </span><span>21</span> <span> { </span><span>22</span> <span>if</span> ((Crc & <span>1</span>) == <span>1</span><span>) </span><span>23</span> Crc = (Crc >> <span>1</span>) ^ <span>0xEDB88320</span><span>; </span><span>24</span> <span>else</span> <span>25</span> Crc >>= <span>1</span><span>; </span><span>26</span> <span> } </span><span>27</span> Crc32Table[i] =<span> Crc; </span><span>28</span> <span> } </span><span>29</span> <span> } </span><span>30</span> <span>31</span> <span>//</span><span>获取字符串的CRC32校验值</span> <span>32</span> <span>public</span> <span>ulong</span> GetCRC32Str(<span>string</span><span> sInputString) </span><span>33</span> <span> { </span><span>34</span> <span>//</span><span>生成码表</span> <span>35</span> <span> GetCRC32Table(); </span><span>36</span> <span>byte</span>[] buffer =<span> System.Text.ASCIIEncoding.ASCII.GetBytes(sInputString); </span><span>37</span> <span>ulong</span> value = <span>0xffffffff</span><span>; </span><span>38</span> <span>int</span> len =<span> buffer.Length; </span><span>39</span> <span>for</span> (<span>int</span> i = <span>0</span>; i < len; i++<span>) </span><span>40</span> <span> { </span><span>41</span> value = (value >> <span>8</span>) ^ Crc32Table[(value & <span>0xFF</span>)^<span> buffer[i]]; </span><span>42</span> <span> } </span><span>43</span> <span>return</span> value ^ <span>0xffffffff</span><span>; </span><span>44</span> <span> } </span><span>45</span> <span> } </span><span>46</span> }
|
CRC16算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| <span> 1</span> <span>public</span> <span>static</span> <span>byte</span>[] CRC16(<span>string</span><span> sInputString) </span><span> 2</span> <span> { </span><span> 3</span> <span>byte</span>[] data =<span> System.Text.ASCIIEncoding.ASCII.GetBytes(sInputString); </span><span> 4</span> <span>int</span> len =<span> data.Length; </span><span> 5</span> <span>if</span> (len > <span>0</span><span>) </span><span> 6</span> <span> { </span><span> 7</span> <span>ushort</span> crc = <span>0xFFFF</span><span>; </span><span> 8</span> <span> 9</span> <span>for</span> (<span>int</span> i = <span>0</span>; i < len; i++<span>) </span><span>10</span> <span> { </span><span>11</span> crc = (<span>ushort</span>)(crc ^<span> (data[i])); </span><span>12</span> <span>for</span> (<span>int</span> j = <span>0</span>; j < <span>8</span>; j++<span>) </span><span>13</span> <span> { </span><span>14</span> crc = (crc & <span>1</span>) != <span>0</span> ? (<span>ushort</span>)((crc >> <span>1</span>) ^ <span>0xA001</span>) : (<span>ushort</span>)(crc >> <span>1</span><span>); </span><span>15</span> <span> } </span><span>16</span> <span> } </span><span>17</span> <span>byte</span> hi = (<span>byte</span>)((crc & <span>0xFF00</span>) >> <span>8</span>); <span>//</span><span>高位置</span> <span>18</span> <span>byte</span> lo = (<span>byte</span>)(crc & <span>0x00FF</span>); <span>//</span><span>低位置</span> <span>19</span> <span>20</span> <span>return</span> <span>new</span> <span>byte</span><span>[] { hi, lo }; </span><span>21</span> <span> } </span><span>22</span> <span>return</span> <span>new</span> <span>byte</span>[] { <span>0</span>, <span>0</span><span> }; </span><span>23</span> <span> } </span><span>24</span> <span>25</span> <span>//</span><span> ASCII码转为字符串</span> <span>26</span> <span>public</span> <span>static</span> <span>string</span> ByteToString(<span>byte</span>[] arr, <span>bool</span><span> isReverse) </span><span>27</span> <span> { </span><span>28</span> <span>try</span> <span>29</span> <span> { </span><span>30</span> <span>byte</span> hi = arr[<span>0</span>], lo = arr[<span>1</span><span>]; </span><span>31</span> <span>return</span> Convert.ToString(isReverse ? hi + lo * <span>0x100</span> : hi * <span>0x100</span> + lo, <span>16</span>).ToUpper().PadLeft(<span>4</span>, <span>'</span><span>0</span><span>'</span><span>); </span><span>32</span> <span> } </span><span>33</span> <span>catch</span> (Exception ex) { <span>throw</span><span> (ex); } </span><span>34</span> }
|
posted @ 2018-06-23 13:12 uusystem 阅读(6727) 评论() 编辑 收藏 举报