c语言 crc16 不是8的整数倍,当输入是奇数位(不是字节)时生成CRC8/16的最佳方法?C或Python...
在前面填充0不应该改变结果。计算CRC本质上是二进制长除法。不幸的是,这涉及到分割每个字节。使用移位运算符和按位or很容易实现。在
结尾处的零填充要容易得多,并且取决于计算CRC的原因,这是一个完全合理的做法。例如,如果您使用CRC进行完整性检查。在
编辑以我的评论为例。如果您有11个位11101110111,并且要计算CRC,请将它们填充为00000111 01110111=0x777,不要填充它们以获得0x7770,因为这将具有不同的CRC。在
这样做的原因是CRC本质上是二进制长除法1 0 1 = 5
-
1 0 0 1 1 / 1 1 0 1 1 0 1
1 0 0 1 1 | |
- | |
1 0 0 0 0 |
0 0 0 0 0 |
- |
1 0 0 0 0 1
1 0 0 1 1
-
1 1 1 0 = 14 = remainder
结果与
^{pr2}$
对于任何数量的前导零也是类似的。在
注意在这一点上,除非你是一名正在寻找实地工作的精神病医生,想要成为一名医生,或是暗地里想去看一名医生,否则跳到超级双秘密试用编辑
由于问题更改而进一步编辑
如果有一个非平凡的初始向量,可以执行以下操作。假设我们要用FFFF的初始值设定项计算上述字符串的CRC-CCITT CRC。我们填充字符串得到0x0FFF用初始化器0计算CRC-CCIT得到0x0ECE,然后用初始化器0xFFFF为0x0000计算CRC-CCIT得到0x1D0F,并对它们进行异或0x0ECE xor 0x1D0F=0x13C1。在
如果多项式是原始的(我认为它们都是原始的),那么任意0字符串和非零初始值设定项的CRC可以很快计算出来,但是它变得很复杂,而且我几乎没有足够的时间。在
该技术的实质是我们可以把移位寄存器的状态看作一个多项式。如果我们用n个一初始化它,这与把初始多项式看作p(x)=x^(n-1)+x^(n-2)。。。+x+1。计算一个包含k零的字符串的CRC相当于找到p(x)x^kmod CRC。x^kmod CRC很容易通过重复的平方和约化找到。任何GF(2)上多项式运算的库都应该这样做。在
甚至进一步编辑对于非零初始值设定项,用零填充并将初始值设定项更改为一个值,以便在读取| pad |个零之后,移位寄存器包含FFFF(或您想要的任何值)。这些可以预先计算,你只需要存储其中的16或32个(或者不管你的crc多项式中有多少位)。在
例如,对于带有初始值设定项0xFFFF和单个位0填充的CRC-CCIT,我们希望使用0xF7EF的初始值设定项。这些可以通过使用扩展的欧几里德算法找到x^(-1)mod CRC,然后计算不同填充长度的初始值*x^(-k)mod CRC来计算。再次任何GF(2)多项式包应该使这容易。我以前用过NTL,发现它相当灵活,但在这里可能有点过头了。即使是对于32位的crcs exhjaustive搜索也可能会比编写代码更快地找到初始化器。在
超级双密试用编辑
好吧,事情其实比我想象的要简单得多。上面的基本思想是正确的,我们希望在字符串的前面加上0,以根据我们的软件实现的需要将大小扩展到8、16或32的倍数,我们想改变我们的初始向量来设置我们的状态,在读取填充零之后,LFSR将被设置为我们想要的初始向量。我们当然可以使用galois field算法来实现这一点,但有一种更简单的方法:只需反向运行LFSR。在
例如,如果我们要计算11位11位111011011111的CRC-CCITT(0xFFFF),我们用5 0填充它们,得到0000011101110111,然后将LFSR向上返回五个空格,以获得0xF060的初始向量。(我是手工计算的,小心点)。
因此,如果您使用0xF060的IV启动LSFR(或软件实现),并在0x0fff上运行它,那么您将获得与在原始11位上运行IV 0xFFFF的LFSR相同的结果。在
c语言 crc16 不是8的整数倍,当输入是奇数位(不是字节)时生成CRC8/16的最佳方法?C或Python...相关推荐
- 交换一个整数二进制表示中的奇数位和偶数位
题目 原文: 写程序交换一个整数二进制表示中的奇数位和偶数位,用尽可能少的代码实现. (比如,第0位和第1位交换,第2位和第3位交换-) 解答 这道题目比较简单.分别将这个整数的奇数位和偶数位提取出来 ...
- 编程判断一个实数(任何位数)是否为0.5的整数倍
0.5的整数倍 Time Limit: 1000MS Memory Limit: 100K Total Submissions: 1 Accepted: 1 Description 输入一个实 ...
- ACMNO.22 C语言-公约公倍2 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。 输入 两个数 输出 最大公约数 最小公倍数
题目描述 写两个函数,分别求两个整数的最大公约数和最小公倍数, 用主函数调用这两个函数,并输出结果两个整数由键盘输入. 输入 两个数 输出 最大公约数 最小公倍数 样例输入 6 15 样例输出 3 3 ...
- C语言的本质(3)——整数的本质与运算
C语言的本质(3)--整数的本质与运算 计算机存储的最小单位是字节(Byte),一个字节通常是8个bit.C语言规定char型占一个字节的存储空间.如果这8个bit按无符号整数来解释,则取值范围是0~ ...
- C语言学习之求两个整数的最大值
C语言学习之求两个整数的最大值 #include <stdio.h> int main(){int a,b,c;//定义变量int max(int x,int y);//调用函数max的声 ...
- 语言取10的整数倍_C语言结构体用法很多,坑也很多
C语言可谓是编程界的传奇语言,历经几十年,依然排名前列. 前不久还写了一篇文章<2019年11月C语言接近Java>,说了C语言是比较受欢迎的一种语言,有望在年底超过JAVA,再次成为第一 ...
- C语言试题三十二之编写函数function,它的功能是:将一个字符串转换为一个整数(不得调用c语言提供的将字符串转换为整数的函数)。
1. 题目 请编写函数function,它的功能是:将一个字符串转换为一个整数(不得调用c语言提供的将字符串转换为整数的函数). 2 .温馨提示 C试题汇总里可用于计算机二级C语言笔试.机试.研究生复 ...
- 查找整数c语言编程,关于算法:查找整数的位数
查找正整数的位数的最佳方法是什么? 我发现了这3种基本方法: 转换为字符串 String s = new Integer(t).toString(); int len = s.length(); fo ...
- 语言取10的整数倍_C语言面试题(一)
哈喽,前几篇文章将C语言基础 简单的写了写,不知道大家能不能理解哈,今天更新下C语言的一些常见面试题,希望能帮助到大家. 1.描述⼀下gcc的编译过程? gcc编译过程分为4个阶段:预处理.编译.汇编 ...
最新文章
- 01背包java 源码
- Linux 操作命令(1)
- JavaScript通过RegExp实现客户端验证
- 【创业】创业团队的那些事(二)
- 基于JAVA+Servlet+JSP+MYSQL的学生卡消费统计管理系统
- Javascript中递归造成的堆栈溢出及解决方案
- 计算机应用技术ps考证,2017计算机等级考试一级Photoshop应用试题及答案
- 用python 调用whatsapp自动发消息
- 英寸和厘米的换算python_运用python实现英制单位英寸与公制单位厘米互换
- 软考知识点笔记之----信息系统特点
- 江南鹤微信公众号文章采集器,开发完成了!以后再也不发愁采集微信公众号文章了!
- 每日一练 — 2021.12.30
- 微博数据解析:国产彩妆品牌对比 | 完美日记 VS 花西子
- Python-七段数码管的绘制实例
- k8s二进制部署 1.17.3
- java游戏主角叶开,逸之老板的天机城与叶开大神女魃墓,决赛场上谁更抢眼?...
- 29岁了还一事无成也许是人生的常态
- 驾考培训系统驾考答题系统科目一科目二科目三科目四模拟考试培训系统源码
- RTMP与Flowplayer实现web页面视频流播放功能
- 山东科技大学oj 1490 该按哪些键
热门文章
- 六年级下计算机教案封面,人教版六年级数学下册教案
- 丰田栽了的原因,嵌入式软件工程师都该看看
- 机器学习:基于Apriori算法对中医病症辩证关联规则分析
- win7本地连接状态信息空白的解决方法
- 分享88个ASP.NET电子商务源码,总有一款适合您
- 编译内核时遇到“dpkg-gencontrol: error: package not in control info”的解决办法
- 2022 RoboCom 世界机器人开发者大赛-本科组(省赛)RC-u4 攻略分队 (已完结)
- UE4 自定义鼠标样式
- 2020国家网安周:建立开放协作的数据流动规则刻不容缓
- Theia开发环境搭建