12.1 C#实现CRC32和CRC16

CRC32算法

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

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