CRC校验实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三CRC校验

一、CRC校验码的基本原理

编码过程:

CRC校验码的编码方法是用待发送的二进制数据t(x)除以生成多项式g(x),将最后的余数作为CRC校验码。

其实现步骤如下:

1 设待发送的数据块是m位的二进制多项式t(x),生成多项式

为r阶的g(x)。在数据块的末尾添加r个0,数据块的长度增加到m+r位。

2 用生成多项式g(x)去除,求得余数为阶数为r-1的二进制

多项式y(x)。此二进制多项式y(x)就是t(x)经过生成多项式g(x)编码的CRC校验码。

3 将y(x)的尾部加上校验码,得到二进制多项式。就是包含

了CRC校验码的待发送字符串。

解码过程:

从CRC的编码规则可以看出,CRC编码实际上是将代发送的m位

二进制多项式t(x)转换成了可以被g(x)除尽的m+r位二进制多项式

所以解码时可以用接收到的数据去除g(x),如果余数位零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。许多CRC的硬件解码电路就是按这种方式进行检错的。

同时,可以看做是由t(x)和CRC校验码的组合,所以解码时将接

收到的二进制数据去掉尾部的r位数据,得到的就是原始数据。

解码过程示例:

运行结果:

附录(实现代码):

using System;

using System.Collections.Generic;

using System.Text;

namespace CRC

{

public abstract class Change

{

///

/// 字节数组转进制

///

/// 字节数组

/// 字节数组长度

public static string ByteToHex(byte[] bytes, int b1)

{

string returnStr = "";

if (bytes != null)

{

for (int i = 0; i < b1; i++)

{

returnStr += bytes[i].ToString("x2").ToUpper();

} }

return returnStr;

}

///

/// 16进制转字节数组

///

/// 16进制数

public static byte[] HexToByte(string hexStr)

{

hexStr = hexStr.Replace(" ", "");

if ((hexStr.Length % 2) != 0)

hexStr += " ";//空格

byte[] bytes = new byte[hexStr.Length / 2];

for (int i = 0; i < bytes.Length; i++)

{

bytes[i] = Convert.ToByte(hexStr.Substring(i * 2, 2), 16);} return bytes;}

///

/// 字符串转进制

///

/// 字符串

///

public static string StrToHex(string str)

{

if (str == "") return "";

byte[] bTemp = System.Text.Encoding.Default.GetBytes(str);

return ByteToHex(bTemp, bTemp.Length);

}

///

/// 16进制转字符串

///

/// 16进制

///

public static string HexToStr(string str)

{

byte[] bytes = new byte[str.Length];

bytes = HexToByte(str);

return Encoding.Default.GetString(bytes);

}

}

}

namespace CRC

{

//哈夫曼树150

// 结点类Node的定义如下:

public class Node

{

private int weight; //结点权值

private int lChild; //左孩子结点

private int rChild; //右孩子结点

private int parent; //父结点

//结点权值属性

public int Weight

{

get

{

return weight;

}

set

{

weight = value;

}

}

//左孩子结点属性

public int LChild

相关文档
最新文档