当前位置: 首页 > news >正文

微信建站网站品牌购买网站

微信建站网站,品牌购买网站,传媒公司排名,纯静态网站页面优化算法介绍 循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错…

算法介绍

  • 循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。
  • CRC校验计算速度快,检错能力强,易于用编码器等硬件电路实现。从检错的正确率与速度、成本等方面,都比奇偶校验等校验方式具有优势。因而,CRC 成为计算机信息通信领域最为普遍的校验方式。常见应用有以太网/USB通信,压缩解压,视频编码,图像存储,磁盘读写等

参数模型

CRC参数模型
不知道你是否遇到过这种情况,同样的CRC多项式,调用不同的CRC计算函数,得到的结果却不一样,而且和手算的结果也不一样,这就涉及到CRC的参数模型了。计算一个正确的CRC值,需要知道CRC的参数模型。

一个完整的CRC参数模型应该包含以下信息:WIDTH,POLY,INIT,REFIN,REFOUT,XOROUT。

NAME:参数模型名称。

WIDTH:宽度,即生成的CRC数据位宽,如CRC-8,生成的CRC为8位

POLY:十六进制多项式,省略最高位1,如 x8 + x2 + x + 1,二进制为1 0000 0111,省略最高位1,转换为十六进制为0x07。

INIT:CRC初始值,和WIDTH位宽一致。

REFIN:true或false,在进行计算之前,原始数据是否翻转,如原始数据:0x34 = 0011 0100,如果REFIN为true,进行翻转之后为0010 1100 = 0x2c

REFOUT:true或false,运算完成之后,得到的CRC值是否进行翻转,如计算得到的CRC值:0x97 = 1001 0111,如果REFOUT为true,进行翻转之后为11101001 = 0xE9。

XOROUT:计算结果与此参数进行异或运算后得到最终的CRC值,和WIDTH位宽一致。

  • 接收端的校验有两种方式:
    • 一种是和CRC计算一样,在本地把接收到的数据和CRC分离,然后在本地对数据进行CRC运算,得到的CRC值和接收到的CRC进行比较,如果一致,说明数据接收正确,如果不一致,说明数据有错误。

    • 另一种方法是把整个数据帧进行CRC运算,因为是数据帧相当于把原始数据左移8位,然后加上余数,如果直接对整个数据帧进行CRC运算(除以多项式),那么余数应该为0,如果不为0说明数据出错

代码计算

#include <stdio.h>
#include <stdlib.h>
#include <string.h>//求数的二进制最高位的幂指数,即MSB
static int getMinPolynomialBits(uint64_t n) {int r = 0;while (n >>= 1) r++;return r;
}//append>0表示计算crc校验码,赋值到crcRemainder
//append=0,表示校验输入bit流是否正确;0表示正确,-1表示错误
//此处的多项式默认为0x96(高位补1后的结果),默认crc位数为7,可根据代码自行修改
static int crcCheck(const char* msg, int append, char* crcRemainder)
{if (msg == NULL || crcRemainder == NULL || strlen(msg) == 0) {printf("input parameter is unvalid!\n");return -1;}//hex: 0x96 = b'10010110' = DEC:150 uint64_t poly = 0x96; int polyLen = getMinPolynomialBits(poly + 1); //=7int msgLen = strlen(msg);//printf("%d\n", msgLen);//计算crc校验码if (append) {unsigned char* pBufCrc = (unsigned char*)calloc(msgLen + polyLen, sizeof(unsigned char)); memset(pBufCrc, 0, msgLen + polyLen);for (int j = 0; j < msgLen; j++) {pBufCrc[j] = msg[j] - '0';}uint8_t* p = NULL;for (int i = 0; i < msgLen; i++) {if (pBufCrc[i]) {p = pBufCrc + i + polyLen;uint64_t t = poly;do {*(p--) ^= t & 1;} while (t >>= 1);}}p = NULL;size_t k;for (k = 0; k < polyLen; k++) {crcRemainder[k] = pBufCrc[k + msgLen] + 48;}if (pBufCrc) {free(pBufCrc);pBufCrc = NULL;}}else {// 校验接受端的比特流unsigned char* pBuffer = (unsigned char*)calloc(msgLen, sizeof(unsigned char)); memset(pBuffer, 0, msgLen);int inforLen = msgLen - polyLen;//提取出信息流部分,然后计算当前信息对应crc校验码for (int j = 0; j < inforLen; j++) {pBuffer[j] = msg[j] - '0';}uint8_t* p = NULL;for (int i = 0; i < inforLen; i++) {if (pBuffer[i]) {p = pBuffer + i + polyLen;uint64_t t = poly;do {*(p--) ^= t & 1;} while (t >>= 1);}}p = NULL;//计算得到的crc码和输入的crc码进行对比验证,若每一位都相同,则校验成功for (size_t k = inforLen; k < msgLen; k++) {if (msg[k] != pBuffer[k] + 48) {if (pBuffer) {free(pBuffer);pBuffer = NULL;}return -1;}}if (pBuffer) {free(pBuffer);pBuffer = NULL;}}return 0;
}

参考链接

原文链接:https://blog.csdn.net/whik1194/article/details/108837493

http://www.yayakq.cn/news/754259/

相关文章:

  • 给客户建设网站税率深圳做网站建设月薪多少
  • 做搜狗pc网站点网站目录管理模板
  • 正规网站建设建设公司深入挖掘wordpress
  • 网站备案多个域名备案单上填几个软件项目管理案例分析
  • 什么网站可以接活在家做上海智能网站建设设计
  • 深圳品牌网站建设服务费用网站备案要到哪里下载
  • 做论坛网站数据库需多大做救助流浪动物网站的产生背景
  • 怎么优化网站关键词的方法淘宝网页设计报告
  • 6617网址导航彩票网站大全企业所得税核定征收办法
  • 网站建设与维护实训心得巴中建设银行网站
  • 深圳制作网站建设网站开发技术与开发环境
  • 余杭区网站建设设计公司网站建设服务器价格
  • 石家庄外贸公司网站设计公司旅游网站做seo
  • 网站建设技术团队有多重要网站构建计划
  • 图片网站seo招商网站建设定做
  • 网站建设设计目的成都花园设计公司
  • 旅行社应做哪些网站汕头网站建设托管
  • 给人做logo的网站做京东网站采购的工作内容
  • 太原市建设局网站外贸销售模式
  • 企业网站建设前网站目的需明确node网站开发需要学什么
  • 北京seo网站优化公司计算机类十大含金量证书
  • 查看网站的外链网站开发及技术路线
  • 高端的深圳网站页面设计百度指数首页
  • 男女直接做的视频视频网站免费设计室内装修软件
  • 内部网站链接怎么做wordpress iis 伪静态
  • 网站开发通用流程石家庄专业制作网站
  • 网站模板 餐饮代理充值平台网站
  • 马鞍山网站建设方案vue做公司网站
  • 如何做单网页网站平面设计创意作品欣赏
  • 做家教一般在哪个网站免费广告制作