关于CRC循环冗余校验的总结(C#)
1. 实验要求
(1)通过CRC(循环冗余校对)序列的计算,掌握C#语言中类的静态方法与动态方法的区别。
(2)Shell与Windows Form 的通信作为扩展提高内容。
2. 实验内容
- 主要工作是:设计算法实现CRC序列的计算
CRC的计算过程总结如下:
1、 设置CRC寄存器,并给其赋值0xffff;
2、 读数据文件,并将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把 结果存入到CRC寄存器中。
3、 将CRC寄存器的数据右移一位,高位补零,并检查溢出位。
4、 如果移出位为0,重复第三步;若低位为1,CRC寄存器与多项式码(此处取0xA001 即二进制1010 0000 0000 0001)相异或。
5、 重复第3步与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
6、 重复第2至第5步直到所有数据所有数据全部处理完毕。
7、 最后将寄存器的高8位数值与寄存器的低8位数值交换位置,即得到CRC的最终值。
- 使用静态方法与动态方法,并比较区别
- 设计windows 窗口程序
3. 详细设计
l 需要设计的主要内容如下:
1) 需要设计计算一次8-bit数据的算法calculate( byte data);
2) 使用文件输入流打开指定路径的文件,并使用readByte()方法,逐字节读入文件,调用上述calculate方法,直到文件尾;
3) 将最终CRC计算数值,高低位换位置,并将结果转化为16进制
l 设计好程序流程图如下:

l 因此,重点为设计calculate算法:
Calculate()代码如下:以静态方法为例
static ushort CRC = 0xffff;
static string result;
// 静态函数计算CRC
public static void calculate(byte y)
{
int count = 0; // 统计移位次数
ushort z = (ushort)(CRC ^ y);
int temp = z; // 移位前的数
int temp2;
while (count < 8)
{
temp2 = temp >> 1; // 移位后的数
count++;
if (temp2 * 2 == temp) // 溢出的为0
{
temp = temp2;
}
else // 溢出的为1
{
temp = temp2 ^ 0xA001;
}
}
CRC = (ushort)temp;
}
l 剩下的只需在main 函数中打开输入文件流,并读入数据,迭代计算即可
4. 上机实验步骤
l 调试的过程:
1、打开文件输出流,创建文本文件,将byte a = 02,byte b = 07, 输出到该文件中,准备测试。


2、程序调试结果为:

多组数据验证了程序的正确性。
5. 实验结果
- 源程序代码如下:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CALCULATING_CRC
{
class Program
{
static ushort CRC = 0xffff;
static string result;
// 静态函数计算CRC
public static void calculate(byte y)
{
int count = 0; // 统计移位次数
ushort z = (ushort)(CRC ^ y);
int temp = z; // 移位前的数
int temp2;
while (count < 8)
{
temp2 = temp >> 1; // 移位后的数
count++;
if (temp2 * 2 == temp) // 溢出的为0
{
temp = temp2;
}
else // 溢出的为1
{
temp = temp2 ^ 0xA001;
}
}
CRC = (ushort)temp;
}
// 非静态函数计算CRC
public void calculation(byte y)
{
int count = 0;
ushort z = (ushort)(CRC ^ y);
int temp = z; // 移位前的数
int temp2;
while (count < 8)
{
temp2 = temp >> 1; // 移位后的数
count++;
if (temp2 * 2 == temp) // 溢出的为0
{
temp = temp2;
}
else // 溢出的为1
{
temp = temp2 ^ 0xA001;
}
}
CRC = (ushort)temp;
}
// 静态函数将10进制数转化为16进制
public static char changeToH(ref int num1)
{
if (num1 > 9)
{
return (char)('A' + num1 - 10);
}
else
return (char)('0' + num1);
}
static void Main(string[] args)
{
Program example = new Program();
ushort x = 0xffff;
Console.WriteLine("请输入打开文件的路径:");
string filePath = Console.ReadLine();
while(!File.Exists(@filePath)) // 打开文件失败
{
Console.WriteLine("请重新输入打开文件的路径:");
filePath = Console.ReadLine();
}
// 文件存在
FileStream Myfile = new FileStream(filePath, FileMode.Open, FileAccess.Read);
int readByte = 0;
readByte = Myfile.ReadByte();
while (readByte != -1)
{
//Program.calculate((byte)readByte); // 调用静态函数
example.calculation((byte)readByte); // 调用非静态函数,需要通过对象实 例调用
readByte = Myfile.ReadByte();
}
Myfile.Close();
int n1 = CRC % 16;
CRC /= 16;
int n2 = CRC % 16;
CRC /= 16;
int n3 = CRC % 16;
CRC /= 16;
int n4 = CRC % 16;
// 交换高低位并产生CRC结果
Program.result = (Program.changeToH(ref n2) + "" + Program.changeToH(ref n1)
+ "" + Program.changeToH(ref n4) + "" + Program.changeToH(ref n3));
Console.WriteLine("CRC运算结果:" + Program.result);
}
}
}
l 控制台应用程序测试数据及结果:(打开文件test2)

l Windows窗口程序测试及结果:(打开文件test2)



6. 结论
过程中遇到的问题:
- 对与byte int short 数据类型的困惑,最后明白异或时对高位不会产生影响,因为int 对short而言高位补0,0不影响异或结果。
- 看不懂题,所以百度了循环校验,好费劲
- 可能在C#中有内置方法方便计算,由于缺乏了解,用到方法都是自己定义
学到的东西
- 对windows 窗体应用程序的基本结构及开发有了初步的了解
- 关于静态方法与动态方法:
1.静态的方法在整个应用程序其间存储在内存中,速度快,但占用内存.
2.动态的方法在先声明类实例才能调用类中的方法.
3.一般使用频繁的方法用静态方法,用的少的方法用动态的。静态的速度快,占内存。动态的速度相对慢些,但调用完后,立即释放类,可以节省内存,可以根据自己的需要选择是用动态方法还是静态方法。
关于CRC循环冗余校验的总结(C#)的更多相关文章
- 【转】 CRC循环冗余校验码
1.CRC CRC循环冗余校验码是数据通信中的一种查错校验码. 循环冗余检查对数据进行多项式计算,将计算结果附加在帧后面,接收数据的设备执行模2运算,保证数据传输的正确性和完整性. 2.模2除法 ①不 ...
- CRC循环冗余校验码
原文转载自:https://blog.csdn.net/hm108106/article/details/73332465 1.CRC CRC循环冗余校验码是数据通信中的一种查错校验码. 循环冗余检查 ...
- CRC循环冗余校验码总结(转)
转自 http://blog.csdn.net/u012993936/article/details/45337069 一.CRC简介 先在此说明下什么是CRC:循环冗余码校验 英文名称为Cyclic ...
- Modbus库开发笔记之八:CRC循环冗余校验的研究与实现
谈到Modbus通讯自然免不了循环冗余校验(CRC),特别是在标准的串行RTU链路上是必不可少的.不仅如此在其他开发中,也经常要用到CRC 算法对各种数据进行校验.这样一来,我们就需要研究一下这个循环 ...
- CRC循环冗余校验算法
现实中通信链路都不会是理想的,比特在传输的过程中可能会出现差错,0变成1,1变成0.这就叫做比特差错.因此为了保证数据传输的可靠性,在计算网络传输数据时,必须采用各种检验措施来处理比特差错.在数据链路 ...
- CRC循环冗余校验---模2除法解析
关于模2除法,网上的人说了一大堆规则和原理,感觉很容易把小白绕进去,下面我只说怎么计算,不说其中的规则和原理.
- CRC(Cyclic Redundancy Check)循环冗余校验码与海明码的计算题
(17)采用CRC进行差错校验,生成多项式为G(X)=X4+X+1,信息码字为10111,则计算出的CRC校验码是 (17) .A.0000 B.0100 C.0010 D.1100试题 ...
- 循环冗余校验(CRC)算法入门引导
目录 写给嵌入式程序员的循环冗余校验CRC算法入门引导 前言 从奇偶校验说起 累加和校验 初识 CRC 算法 CRC算法的编程实现 前言 CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌 ...
- 【转】循环冗余校验(CRC)算法入门引导
原文地址:循环冗余校验(CRC)算法入门引导 参考地址:https://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks#Re ...
随机推荐
- Hadoop学习(一) Hadoop是什么
Hadoop是什么? Hadoop是一个开发和运行处理大规模数据的软件平台,是Appach的一个用Java语言实现开源软件框架,实现在大量计算机组成的集群中对海量数据进行分布式计算. Hadoop框架 ...
- 各种数据库分页语句整理以及Oracle数据库中的ROWNUM和ORDER BY的区别
.oracle数据库分页 select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=s ...
- BZ 600题祭
不知不觉就600题了呢. 明天就要省选了.不要让这个数字定格在这里吧!
- C++11中default的使用
In C++11, defaulted and deleted functions give you explicit control over whether the special member ...
- Hibernate-ORM:12.Hibernate中的多对多关联关系
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客将讲述Hibernate中的多对多关联关系的操作,准备的篇幅较少,望海涵 一,讲述多对多 多对多的关联 ...
- (干货分享)mac python+appium环境搭建
因为mac本自带python2.x(不建议卸载,因为本本本身有很多依赖与此),所以装python3的过程极其坎坷,勉强装好后也总是各种报错.这次装appium环境,直接把原来的python3卸了,用h ...
- 参加2018之江杯全球人工智能大赛 :视频识别&问答(四)
很遗憾没有在规定的时间点(2018-9-25 12:00:00)完成所有的功能并上传数据,只做到写了模型代码并只跑了一轮迭代,现将代码部分贴出. import keras from keras.lay ...
- wangEditor编辑器中解析html图文信息问题
在JS中,有一种方法:innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML. 也就是说,我们可以利用这个属性,把字符串转换为html代码,这样就可以被解析了. 其次,我们是需要在页 ...
- Android插件化框架
1. dynamic-load-apk/DL动态加载框架 是基于代理的方式实现插件框架,对 App 的表层做了处理,通过在 Manifest 中注册代理组件,当启动插件组件时,首先启动一个代理组件 ...
- [转]juery-zTree的基本用法
[简介] zTree 是利用 jQuery 的核心代码,实现一套能完成大部分常用功能的 Tree 插件 兼容 IE.FireFox.Chrome 等浏览器 在一个页面内可同时生成多个 Tree 实例 ...