CRC32/CRC16算法C#中的实现

CRC32算法

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 using System.IO;
 5
 6 namespace GetCRC32
 7 {
 8     class CRC32Cls
 9     {
10         protected ulong[] Crc32Table;
11         //生成CRC32码表
12         public void GetCRC32Table()
13         {
14             ulong Crc;
15             Crc32Table = new ulong[256];
16             int i,j;
17             for(i = 0;i < 256; i++)
18             {
19                 Crc = (ulong)i;
20                 for (j = 8; j > 0; j--)
21                 {
22                     if ((Crc & 1) == 1)
23                         Crc = (Crc >> 1) ^ 0xEDB88320;
24                     else
25                         Crc >>= 1;
26                 }
27                 Crc32Table[i] = Crc;
28             }
29         }
30
31         //获取字符串的CRC32校验值
32         public ulong GetCRC32Str(string sInputString)
33         {
34             //生成码表
35             GetCRC32Table();
36             byte[] buffer = System.Text.ASCIIEncoding.ASCII.GetBytes(sInputString);
37             ulong value = 0xffffffff;
38             int len = buffer.Length;
39             for (int i = 0; i < len; i++)
40             {
41                 value = (value >> 8) ^ Crc32Table[(value & 0xFF)^ buffer[i]];
42             }
43             return value ^ 0xffffffff;
44         }
45     }
46 }

CRC16算法

 1          public static byte[] CRC16(string sInputString)
 2          {
 3              byte[] data = System.Text.ASCIIEncoding.ASCII.GetBytes(sInputString);
 4              int len = data.Length;
 5              if (len > 0)
 6              {
 7                  ushort crc = 0xFFFF;
 8
 9                  for (int i = 0; i < len; i++)
10                  {
11                      crc = (ushort)(crc ^ (data[i]));
12                      for (int j = 0; j < 8; j++)
13                      {
14                          crc = (crc & 1) != 0 ? (ushort)((crc >> 1) ^ 0xA001) : (ushort)(crc >> 1);
15                      }
16                  }
17                  byte hi = (byte)((crc & 0xFF00) >> 8);  //高位置
18                  byte lo = (byte)(crc & 0x00FF);         //低位置
19
20                  return new byte[] { hi, lo };
21              }
22              return new byte[] { 0, 0 };
23          }
24
25 // ASCII码转为字符串
26          public static string ByteToString(byte[] arr, bool isReverse)
27          {
28              try
29              {
30                  byte hi = arr[0], lo = arr[1];
31                  return Convert.ToString(isReverse ? hi + lo * 0x100 : hi * 0x100 + lo, 16).ToUpper().PadLeft(4, ‘0‘);
32              }
33              catch (Exception ex) { throw (ex); }
34          }

原文地址:https://www.cnblogs.com/tianjifa/p/9216985.html

时间: 2024-10-11 18:06:26

CRC32/CRC16算法C#中的实现的相关文章

Redis3.0集群crc16算法php客户端实现方法(php取得redis3.0集群中redis数据所在的redis分区插槽,并根据分区插槽取得分区所在redis服务器地址)

数据分区        Redis集群将数据分区后存储在多个节点上,即不同的分区存储在不同的节点上,每个节点可以存储多个分区.每个分区在Redis中也被称为"hash slot",Redis集群中总共规划了16384个分区. 例如:当集群中有3个节点时,节点A将包含0-5460分区,节点B将包含5461-10922分区,节点C将包含10923-16383分区. 每个key将会存储到一个唯一的分区中,每个分区其实就是一组key的集合,两者对应关系为:key的CRC16校验码%16384=

CRC16算法之一:CRC16-CCITT-FALSE算法的java实现

CRC16算法系列文章: CRC16算法之一:CRC16-CCITT-FALSE算法的java实现 CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现 CRC16算法之三:CRC16-CCITT-MODBUS算法的java实现 前言 JDK里包含了CRC32的算法,但是没有CRC16的,网上搜了一堆没有找到想要的,索性自己实现 注意:CRC16算法分为很多种,本篇文章中,只讲其中的一种:CRC16-CCITT-FALSE算法 CRC16算法系列之一:CRC16-CCITT

编程算法 - 数组中的逆序对 代码(C)

数组中的逆序对 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 在数组中的两个数字如果前面一个数字大于后面的数字, 则这两个数字组成一个逆序对. 输入一个数组, 求出这个数组中的逆序对的总数. 使用归并排序的方法, 辅助空间一个排序的数组, 依次比较前面较大的数字, 算出整体的逆序对数, 不用逐个比较. 时间复杂度: O(nlogn) 代码: /* * main.cpp * * Created on: 2014.6.12 * Author:

编程算法 - 数组中只出现一次的数字 代码(C)

数组中只出现一次的数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 一个整型数组里除了两个数字以外, 其他的数字都出现了两次. 请写程序找出这两个只出现一次的数字. 如果从头到尾依次异或数组中的每一个数字, 那么最终的结果刚好是那个只出现一次的数字. 根据结果数组二进制某一位为1, 以此分组, 为1的一组, 为0的一组, 再重新进行异或. 最后得出两个结果. 时间复杂度O(n). 代码: /* * main.cpp * * Create

算法竞赛中数论理论浅析

一.基本概念 带余除法(division algorithm,除法定理):a∈Z,d∈Z*,有唯一的整数 q 和 r,并且0≤r<d0,满足 a= d q+r.q 称为商,r  称为余数.通俗说法:整数除以正整数得到唯一的商(quotient)和余数(residue).  整除(divide exactly):称 a 整除 b ,当整数 a 除以非零整数 b ,商为整数,且余数为零, 我们就说a能被b整除(或说b能整除a),记作 b|a.b 称为 a 的约数(因数,common divisor)

【斗地主技巧】斗地主算法逻辑中的天之道&lt;转&gt;

******************************************************************** 作者比较喜欢玩斗地主,所以经常搜集一些网友斗地主的心得,下面这一篇,我感觉写得不错,特转载,与网友分享.原文链接 棋牌游戏推荐:JJ比赛 我比较喜欢在这上面玩,可以赢话费,而且积累的金币其实是可以兑换成人民币的,网上有人回收. *******************************************************************

[算法]SA中的所有字符是否均在SB中

思路:空间换时间,hash函数,bitmap,数组标记 #include <iostream> #include <cstring> bool foo(char* sa, char* sb){ //字符串包含问题,sa中的所有字符是否均在sb中,若是返回true,否则返回false //思路,空间换时间 bool flag[256]; memset(flag,false,256); while(*sb){ flag[*sb++] = true; } while(*sa){ if(!

编程算法 - 圆圈中最后剩下的数字(递推公式) 代码(C++)

圆圈中最后剩下的数字(递推公式) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 0,1...,n-1这n个数字排成一个圆圈, 从数字0開始每次从这个圆圈里删除第m个数字. 求出这个圆圈里最后剩下的数字. 能够推导出约瑟夫环的递推公式, 使用循环进行求解,  时间复杂度O(n), 空间复杂度O(1). 代码: /* * main.cpp * * Created on: 2014.7.12 * Author: spike */ #incl

编程算法 - 圆圈中最后剩下的数字(循环链表) 代码(C++)

圆圈中最后剩下的数字(循环链表) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 0,1...,n-1这n个数字排成一个圆圈, 从数字0开始每次从这个圆圈里删除第m个数字. 求出这个圆圈里最后剩下的数字. 使用循环链表, 依次遍历删除, 时间复杂度O(mn), 空间复杂度O(n). 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ #include <iostr