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#)的更多相关文章

  1. 【转】 CRC循环冗余校验码

    1.CRC CRC循环冗余校验码是数据通信中的一种查错校验码. 循环冗余检查对数据进行多项式计算,将计算结果附加在帧后面,接收数据的设备执行模2运算,保证数据传输的正确性和完整性. 2.模2除法 ①不 ...

  2. CRC循环冗余校验码

    原文转载自:https://blog.csdn.net/hm108106/article/details/73332465 1.CRC CRC循环冗余校验码是数据通信中的一种查错校验码. 循环冗余检查 ...

  3. CRC循环冗余校验码总结(转)

    转自 http://blog.csdn.net/u012993936/article/details/45337069 一.CRC简介 先在此说明下什么是CRC:循环冗余码校验 英文名称为Cyclic ...

  4. Modbus库开发笔记之八:CRC循环冗余校验的研究与实现

    谈到Modbus通讯自然免不了循环冗余校验(CRC),特别是在标准的串行RTU链路上是必不可少的.不仅如此在其他开发中,也经常要用到CRC 算法对各种数据进行校验.这样一来,我们就需要研究一下这个循环 ...

  5. CRC循环冗余校验算法

    现实中通信链路都不会是理想的,比特在传输的过程中可能会出现差错,0变成1,1变成0.这就叫做比特差错.因此为了保证数据传输的可靠性,在计算网络传输数据时,必须采用各种检验措施来处理比特差错.在数据链路 ...

  6. CRC循环冗余校验---模2除法解析

    关于模2除法,网上的人说了一大堆规则和原理,感觉很容易把小白绕进去,下面我只说怎么计算,不说其中的规则和原理.

  7. CRC(Cyclic Redundancy Check)循环冗余校验码与海明码的计算题

    (17)采用CRC进行差错校验,生成多项式为G(X)=X4+X+1,信息码字为10111,则计算出的CRC校验码是  (17)  .A.0000  B.0100   C.0010   D.1100试题 ...

  8. 循环冗余校验(CRC)算法入门引导

    目录 写给嵌入式程序员的循环冗余校验CRC算法入门引导 前言 从奇偶校验说起 累加和校验 初识 CRC 算法 CRC算法的编程实现 前言 CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌 ...

  9. 【转】循环冗余校验(CRC)算法入门引导

    原文地址:循环冗余校验(CRC)算法入门引导 参考地址:https://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks#Re ...

随机推荐

  1. 20145202 2016-2017-2 《Java程序设计》第一周学习总结

    20145202 2016-2017-2 <Java程序设计>第一周学习总结 教材学习内容总结 java是SUN公司推出的面相网络的编程语言. 特点:完全面向对象,与平台无关,跨平台性(例 ...

  2. Hadoop数据倾斜及解决办法

    数据倾斜:就是大量的相同key被partition分配到一个分区里,map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间 ...

  3. 可用率map处理

    total_data =[ {'event_current_dealer': '陈铁', 'id__count': 66}, {'event_current_dealer': '丁凯', 'id__c ...

  4. Cyclone IV器件的逻辑单元和逻辑阵列快

    1. 逻辑单元 (LE) 在 Cyclone IV 器件结构中是最小的逻辑单位.LE 紧密且有效的提供了高级功能的逻辑使用.每个 LE 有以下特性:一个四口输入的查找表 (LUT),以实现四种变量的任 ...

  5. Hackerrank - The Grid Search

    https://www.hackerrank.com/challenges/the-grid-search/forum 今天碰见这题,看见难度是Moderate,觉得应该能半小时内搞定. 读完题目发现 ...

  6. Qt Qpushbutton美化问题

    昨天在论坛看到一个网友的提问,如下 我想到的第一个就是可能需要重载Pushbutton,不过看到有网友回复可以使用stykesheet解决,今天尝试了一下,还是没有成功, 一下是我使用车重载的Push ...

  7. Qt 飞机仪表显示

    使用Qt简单谢了一个飞机的一小部分仪表,还没有写完,目前只写了一个界面,不过思想应该是一样的. 效果图如下 其中主要由转速表,和下面的部分数字显示构成 转速表代码 .h文件 #ifndef CONTR ...

  8. 解决Unbuntu终端菱形乱码问题

    原因:安装时为了学习方便选择中文安装,其字符编码相关配置如下(在/etc/default/locale中) LANG="Zh_CN.UTF-8 "LANGUAGE="zh ...

  9. deeplearning.ai课程学习(2)

    第二周:神经网络的编程基础(Basics of Neural Network programming) 1.逻辑回归的代价函数(Logistic Regression Cost Function) 逻 ...

  10. java课程设计——2048

    1.团队介绍 2.项目git地址 [https://gitee.com/SMTwula/java036.git] 3.项目git提交记录截图 沈梦婷 田亚琴 4.项目功能架构图与主要功能流程图 5.项 ...