您当前的位置:首页 > 好词好句 > 正文

循环冗余校验码(循环冗余校验码(CRC))

循环冗余校验码(CRC)循环冗余校验码(CRC)的基本原理是: 在K位信息码后再拼接R位的校验码,循环冗余校验码怎么算循环冗余校验码的计算方法:编码原理:现假设有:有效信息:M,根据G(x)可以生成K位信息的校验码,通过C(x)*2R除以生成多项式G(x)得到的余数就是校验码,校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,生成多项式样1011循环校验码解:有效信息1101(k=4),而G(x)叫做这个CRC码的生成多项式,但是蓝军担心的是‘确认信息’如果也不可靠而没有成功到达红军那里。

循环冗余校验码(CRC)

循环冗余校验码(CRC)的基本原理是: 在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。 校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*2R,这样C(x)的右边就会空出R位,这就是校验码的位置。通过C(x)*2R除以生成多项式G(x)得到的余数就是校验码。

循环冗余校验码怎么算

循环冗余校验码的计算方法:

  • 编码原理:

    现假设有:有效信息:M;

    除数G(生成多项式)有:M/G=Q+R/G;

    此时,可选择R作为校验位,则MR即为校验码。

  • 校验原理:(M-R)/G=Q+0/G

    说明:以接收到的校验码除以约定的除数,若余数为0,则可认为接收到的数据是正确的。

    例:有效信息1101,生成多项式样1011

    循环校验码解:

    有效信息1101(k=4),即M(x)=x3+x2+x0,生成多项式1011(r+1=4,即r=3);

    即G(x)=x3+x1+x0,M(x)·x3=x6+x5+x3,即1101000(对1101左移三位);

    M(x)·x3/G(x)=1101000/1011=1111+001/1011    即1010的CRC是:1101001 。

  • 计算图文如下 :

    CRC(Cyclic Redundancy Check)循环冗余校验码,是常用的校验码,在早期的通信中运用广泛,因为早期的通信技术不够可靠(不可靠性的来源是通信技术决定的,比如电磁波通信时受雷电等因素的影响),不可靠的通信就会带来‘确认信息’的困惑,书上提到红军和蓝军通信联合进攻山下的敌军的例子,第一天红军发了条信息要蓝军第二天一起进攻,蓝军收到之后,发一条确认信息,但是蓝军担心的是‘确认信息’如果也不可靠而没有成功到达红军那里,那自己不是很危险?于是红军再发一条‘对确认的确认信息’,但同样的问题还是不能解决,红军仍然不敢贸然行动。

    循环队列

    #include 《stdio.h》#include 《malloc.h》const int MAXSIZE = 100;  //队列的最大长度  typedef int ElemType; //队列的数据类型  typedef struct queue {      ElemType data[MAXSIZE]; //队列      int front; //队头的游标      int rear;  //队尾的游标  }*Queue;    Queue InitQueue() { //初始化队列Queue q = (struct queue *)malloc(sizeof(struct queue));q-》front = q-》rear = 0;return q;}int EnQueue(Queue q,ElemType e) { //让元素e进队if((q-》rear + 1) % MAXSIZE == q-》front) //队列已满return 0;q-》data[q-》rear] = e; //元素e进队q-》rear = (q-》rear + 1) % MAXSIZE; //游标rear上前进一位,如果已达最后,就移到前面return 1;}int DeQueue(Queue q,ElemType *e) { //队头的元素出队存入*eif(q-》rear == q-》front) //如果队列为空返回return 0;*e = q-》data[q-》front]; //返回队头的元素q-》front = (q-》front + 1) % MAXSIZE; //游标front向前移一位,如果是队列的末尾移动到最前面return 1;}int IsEmpty(Queue q) { //判断队列是否为空return (q-》front == q-》rear);}int isFull(Queue q) {  //判断队列是否为满return (q-》rear + 1) % MAXSIZE == q-》front;}int GetQueueLength(Queue q) { //返回队列的长度return (q-》rear - q-》front + MAXSIZE) % MAXSIZE;}void Clear(Queue q) { //清空队列q-》front = q-》rear = 0;}void Print(Queue q) { //打印队列int i;if(q-》front == q-》rear) return;  if(q-》rear 《 q-》front) {for(i = q-》front;i 《 MAXSIZE;++i) printf(“%d “,q-》data[i]);for(i = 0;i 《 q-》rear;++i) printf(“%d “,q-》data[i]);printf(“\n“);}else {for(int i = q-》front;i 《 q-》rear;++i)printf(“%d “,q-》data[i]);printf(“\n“);}}int main() {Queue q = InitQueue();for(int i = 1;i 《 20;++i) EnQueue(q,i);Print(q);int k;DeQueue(q,&k);EnQueue(q,30);Print(q);return 0;  }

    区分循环队列的满与空,只有两种方法,它们是______和______

    区分循环队列的满与空,只有两种方法,它们是(牺牲一个存储单元)和(设标记)。

    为充分利用向量空间,克服“假溢出“现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。

    存储在其中的队列称为循环队列(Circular Queue)。循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。

    扩展资料:

    条件处理

    循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是“空“还是“满“。

    解决这个问题的方法至少有两种:

    1、另设一布尔变量以区别队列的空和满;

    2、另一种方式就是数据结构常用的: 队满时:(rear+1)%n==front,n为队列长度(所用数组大小),由于rear,front均为所用空间的指针,循环只是逻辑上的循环,所以需要求余运算。


    声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

    上一篇: 年度餐饮工作心得感想

    下一篇: 最值得买的手机(如今买什么手机好呢)



    推荐阅读