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

建设银行东四十条支行支行网站百度网络营销中心官网

建设银行东四十条支行支行网站,百度网络营销中心官网,手机wap网站定位,app定制开发制作报价算法介绍 循环冗余校验(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.jinmujx.cn/news/117159.html

相关文章:

  • 网站开发的研究现状青岛网站建设制作公司
  • 提升网站建设品质厦门seo总部电话
  • 深圳场站建设发展有限公司网站案例分析
  • wordpress地址不能修改密码seo网络优化是什么工作
  • php做图片交互网站代码网站优化的关键词
  • 做网站 要域名 主机 还有啥一键建站免费
  • 政府网站建设指导企业推广是什么职业
  • 哪里找做网站的公司廊坊快速优化排名
  • 自己建设一个网站需要多少钱seo优化排名易下拉用法
  • 网站方案策划书百度建站多少钱
  • 重庆做网站做得好的公司跨境电商平台排行榜前十名
  • 广州网站建设58结构优化是什么意思
  • b2c网站建设方案 今日头条
  • 软件项目外包网站360地图下载最新版
  • div+css免费网站模板下载上海seo网络优化
  • 找别人做网站怎么防止后门百度官网登录
  • 茂名企业自助建站系统网站排名英文
  • 做网站引用没有版权的歌曲微信公众号平台官网
  • 装修设计图网站优化什么
  • 苏州建设项目备案网站宁波seo推广哪家好
  • 宝安建网站新郑网络推广外包
  • 品网站建设公司如何做运营推广
  • 网站 营销型品牌营销案例
  • 佛山新网站建设流程谷歌应用商店
  • 网站改版设计关于进一步优化当前疫情防控措施
  • 怎样百度站长捆绑网站百度浏量网络营销事件
  • 活动网站推广方案seo公司是什么意思
  • 潍坊网站建设哪家专业网络营销策划的基本原则是什么
  • 宜春公司做网站sem招聘
  • 一个公司做网站需要注意什么条件注册域名后怎么建网站