C#生成CRC8检验码

循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。

在与硬件设备交互过程中,通常会有一定的通讯指令协议,
完整指令码 = 包头 + 指令 + 校验码, 其中应答消息的最后一位也是校验码,如CRC8, CRC16,CRC32。
根据CRC算法,将 指令 通过 多项式 计算得出校验码

C#生成CRC8代码实现(参考网络)如下:

方法一:查表法
1
public class CRC8
   {
       private byte[] CRC8Table = new byte[] {
       0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,
       157,195,33,127,252,162,64,30, 95,1,227,189,62,96,130,220,
       35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
       190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
       70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
       219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
       101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
       248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
       140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
       17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
       175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
       50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
       202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
       87,9,235,181,54,104,138,212,149,203, 41,119,244,170,72,22,
       233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,
       116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53 };

       public byte CRC(byte[] buffer)
       {
           return CRC(buffer, 0, buffer.Length);
       }

       public byte CRC(byte[] buffer, int off, int len)
       {
           byte crc = 0;
           if (buffer == null)
           {
               throw new ArgumentNullException("buffer");
           }
           if (off < 0 || len < 0 || off + len > buffer.Length)
           {
               throw new ArgumentOutOfRangeException();
           }

           for (int i = off; i < len; i++)
           {
               crc = CRC8Table[crc ^ buffer[i]];
           }
           return crc;
       }
}
方法二
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static byte CRC8(byte[] buffer)
{

byte crc = 0;
for (int j = 0; j < buffer.Length; j++)
{
crc ^= buffer[j];
for (int i = 0; i < 8; i++)
{
if ((crc & 0x01) != 0)
{
crc >>= 1;
crc ^= 0x8c; //0x8c是多项式
}
else
{
crc >>= 1;
}
}
}
return crc;
}

参考资料:

  1. C# 取得 CRC8 CRC16 CRC32
  2. A CRC8 implementation in C#

基于shadowsocks的扩展以测试科学上网

起因

lantern / lantern-github (须外网访问,lantern_cn不需要)要下载最新版本才能使用,而且每个月限制800M流量,查资料有时候不太方便


个人科学上网史:
goagent —> Host修改 —> VPN —> shadowsocks —> lantern
多数情况下是为了查阅相关资料,像github, google等,已习惯墙内网络,因为已能满足大部分需求。

Shadowsocks 是非常方便的科学上网工具,
基本使用方法:

  • 在任务栏找到 Shadowsocks 图标
  • 在 服务器 菜单添加多个服务器
  • 选择 启用系统代理 来启用系统代理。请禁用浏览器里的代理插件,或把它们设置为使用系统代理。
  • 除了设为系统代理,你也可以直接自己配置浏览器代理。在 SwitchyOmega 中把代理设置为 SOCKS5 或 HTTP 的 127.0.0.1:1080。这个 1080 端口可以在服务器设置中设置。

想到 ishadowsocks 有提供实验账号,且shadowsocks for Windows开放源代码,于是想在V2.5.8主界面基础上添加按钮,一键获取实验账号,用于个人测试科学上网,改善网络。

说明

  • 由于添加的代码中使用了硬编码,当iss的地址或者页面修改后,工具不能正常获取实验账号
  • 代码已上传到https://github.com/zeminlin/shadowsocks_windows_extend, 可自行pull下来编译
  • 仅作为个人使用的测试使用,只经过自己的台式机测试(Win10企业版 64位),未经过大量测试,不保证能正确运行,另外,不打算实现定时获取实验账号
  • 由于使用的人比较多,可能速度比较慢,仅满足基于日常查阅资料

再次感谢 ishadowsocks 提供的实验账号!如有侵权之类的,请联系本人删除相关资料, 谢谢。


Tips:可以到 http://pan.baidu.com/s/1hspuj4K 下载,提取密码为gcm9,当然啦,自己 pull 下来编译也挺方便的