0%

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 &lt; <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 &gt; <span>0</span>; j--<span>)
</span><span>21</span> <span> {
</span><span>22</span> <span>if</span> ((Crc &amp; <span>1</span>) == <span>1</span><span>)
</span><span>23</span> Crc = (Crc &gt;&gt; <span>1</span>) ^ <span>0xEDB88320</span><span>;
</span><span>24</span> <span>else</span>
<span>25</span> Crc &gt;&gt;= <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 &lt; len; i++<span>)
</span><span>40</span> <span> {
</span><span>41</span> value = (value &gt;&gt; <span>8</span>) ^ Crc32Table[(value &amp; <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 &gt; <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 &lt; 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 &lt; <span>8</span>; j++<span>)
</span><span>13</span> <span> {
</span><span>14</span> crc = (crc &amp; <span>1</span>) != <span>0</span> ? (<span>ushort</span>)((crc &gt;&gt; <span>1</span>) ^ <span>0xA001</span>) : (<span>ushort</span>)(crc &gt;&gt; <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 &amp; <span>0xFF00</span>) &gt;&gt; <span>8</span>); <span>//</span><span>高位置</span>
<span>18</span> <span>byte</span> lo = (<span>byte</span>)(crc &amp; <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> }

复制代码

更多内容请访问 www.uusystem.com

posted @ 2018-06-23 13:12  uusystem  阅读(6727)  评论()  编辑  收藏  举报