搞工业控制的人大概都有过这种半夜被电话叫醒的经历现场PLC和变频器之间的Modbus RTU通信忽然全乱了仪表回了几帧数据就是没反应。排查到最后发现是写程序的人把CRC算错了报文每帧都带着错误校验值从站直接把帧丢了。类似的事我在不同项目里见过很多次手机解压一个ZIP文件ZArchiver突然弹CRC错误用Wireshark抓的以太网帧里偶尔出现bad FCS警告。这三个场景听着八竿子打不着底层用的却是同一个东西——CRC校验。CRC的全称是循环冗余校验Cyclic Redundancy Check干的事就一件发送方往报文里追加一段根据内容算出来的短校验码接收方拿同样的算法重算一遍对不上就说明数据在传输或存储过程中被动过手脚。这篇文章不打算从数学定义抄起而是直接围绕CRC的原理、手算方法、程序实现以及Modbus、以太网帧、文件解压这些真实场景把坑一个个趟完。不管你是写单片机固件的还是用Python处理网络报文的或者只是被ZArchiver报错折磨过的普通用户都能在里面找到自己需要的那一段。1. 三个坑把我逼进了CRC的世界1.1 一次Modbus通信故障引出的CRC问题先说那次最典型的现场经历。一个污水处理项目里S7-200 SMART做主站读一台在线PH计的数值用的是Modbus RTU协议。程序写完上电PH计就是不应答。用串口监视工具抓了一下总线主站发出的报文是01 03 00 00 00 01 84 0A从站毫无反应。问题出在最后两个字节84 0A——那是我当时拍脑袋算的CRC实际上对于01 03 00 00 00 01这五个字节正确结果是0A 84低字节在前。就差了字节序整个通信链路是断的。这件事让我意识到CRC不是加个校验就完事它有完整的标准可循多项式、初值、字节序、结果异或任何一项和通信对方不一致结果都完全不对。Modbus RTU用的CRC-16/Modbus算法初值是0xFFFF输出是低字节在前。这些参数写在协议文档里但很多人只抄了一段代码不知道参数含义一换芯片平台就翻车。1.2 ZArchiver的CRC错误意味着什么另一类常见场景是手机解压。从网上下了一个压缩包ZArchiver解到一半突然弹出CRC错误文件损坏。很多人觉得这是解压软件的问题其实ZArchiver只是用自己的CRC算法把压缩包里存的校验值和实际解压出来的数据重新算了一遍发现对不上于是拒绝继续。这里面的关键点在于压缩包里的文件在打包时已经被算好一个CRC-32值存进了压缩包元数据。解压时软件一边解压一边重新计算算完再对比。对不上说明压缩包在下载、拷贝或存储过程中有一小段数据出了问题。网络丢包、U盘坏块、内存卡格式不对都可能导致这种情况。千万别反复重试解压同一个损坏的压缩包那个文件物理上已经不对了重试一百次结果都一样。1.3 计算机网络报文里的CRC帧尾的FCS第三个场景是抓包。用Wireshark抓以太网帧时如果开启帧校验检查偶尔能看到bad FCS之类的红色警告。以太网帧的尾部有一个4字节的帧校验序列FCS用的就是CRC-32算法覆盖从目的MAC到数据字段的整个帧。接收方对收到的数据重新算一遍CRC-32和帧尾的FCS比对不一致就丢弃帧。但这里有坑有线网卡捕获报文时通常会把帧尾FCS剥离掉或者由网卡硬件自己完成校验后再交给抓包工具所以Wireshark里默认看不到以太网FCS。我刚开始玩抓包时还以为帧尾那4字节是开玩笑的。后来在无线抓包场景里才真正看到FCS——802.11帧的尾部和以太网不同很多无线抓包模式能抓到完整的带FCS帧。三件事看完你会发现CRC无处不在只是它藏在不同报文格式的角落出了问题才被肉眼注意到。2. CRC的数学底牌多项式除法与那个不会漏掉的余数2.1 为什么叫循环冗余校验先解释循环两个字很多人学完CRC都不知道CRC全称里的Cyclic从哪来。CRC的数学基础是二进制多项式的模2除法而多项式本身具有循环移位的特殊性质——生成多项式通常是某个循环码生成多项式的因子这使得CRC在工程上能检测出非常多的错误模式尤其是突发错误。但实操中你不需要记住这句话你只要理解CRC本质上是一次大数除法除完的余数就是校验码。这么说有点抽象换个姿势。你把要发送的一串二进制数据比如01010011看成一个大整数。发送方和接收方事先约定一个固定的除数G这个G在CRC术语里叫生成多项式。发送方把数据后面补上若干0补的位数等于最终校验码的位数再用模2除法除以G把得到的余数追加到数据后面发出去。接收方收到数据余数的完整串之后再次除以G。如果能整除说明数据没被改动过如果不能整除说明中间某一位或多位翻转了。2.2 模2除法CRC计算唯一需要掌握的运算模2除法听起来高大上其实核心只有一条规则加减法都不进位、不借位全靠异或完成。两个二进制位相加000、011、101、110。这个110就是异或运算意思是两个1碰到一起就抵消了。乘除法里也处处用异或。比如1101减去1011普通减法得0010模2减法是按位异或得0110。用生活化的类比想象一排开关0是关1是开。异或操作就是拨一下开关如果原来是关按一下就开原来是开按一下就关。两个1按异或就是连续按两次开关又回到关。这种按两次等于没按的性质让模2除法可以被硬件移位寄存器极其高效地实现——不需要真正的除法器电路只需要一堆异或门和移位寄存器一个时钟周期处理一位。2.3 生成多项式G是怎么约定出来的CRC-n里的n代表校验码的位数也代表除法的余数位数。CRC-8的校验码是8位CRC-16是16位CRC-32是32位。生成多项式G是二进制位数n1的数因为余数位数是n除数就需要比余数多一位。比如以太网FCS用的CRC-32生成多项式是0x04C11DB7写完整二进制是1 0000 0100 1100 0001 0001 1101 1011 0111总共33位。而这串数的最高位永远是1所以很多文档里只写低32位0x04C11DB7。为什么不同协议选不同多项式因为不同多项式对不同错误模式的检测能力略有差异。有些多项式对偶数个错误位更敏感有些对突发错误的覆盖率更高。历史上经过大量理论分析工程上只用少数几个经过验证的标准多项式。这里有个非常关键的认知生成多项式的最高位和最低位必须都是1这是保证CRC能检测所有奇数个错误位和所有长度不超过n的突发错误的前提。2.4 手算一次CRC-8从补位到余数纸上谈兵不如实际算一次。我们来算CRC-8生成多项式用常见的0x07它完整写法是0x107即1000001119位对应多项式$x^8x^2x1$。待发送数据是单字节0x53二进制01010011。第一步数据后补8个0CRC-8的余数位数就是8得到0101001100000000。第二步用这个16位数除以100000111除法全程按模2规则。过程可以用下面的Python代码等价实现更方便你验证每一步def crc8(data: bytes, poly: int, init: int) - int: crc init for byte in data: crc ^ byte for _ in range(8): if crc 0x80: # 最高位是1需要异或多项式 crc ((crc 1) ^ poly) 0xFF else: crc (crc 1) 0xFF return crc print(hex(crc8(b\x53, 0x07, 0x00))) # 输出 0xbe手算和程序算的结果一致0xBE。所以发送方发出0x53 0xBE。接收方收到后把整个0x53 0xBE重新除一遍0x107余数恰好是0。这个重新算一遍得到0的性质非常关键后面验收CRC程序时要反复用到它。2.5 多项式余数为什么能抓住单比特翻转想想看如果数据里有一位被翻转比如接收方收到的是0x53 0xBF整个串除以G余数就很难是0。因为数据内容变了除法过程里每一步异或的对象都变了最终余数也会变。理论上会不会存在一种翻转余数仍然是0存在但概率很低。16位CRC理论上每65536个错误里大约有一个能恰好满足整除条件32位CRC则是每2^32个错误里大约有一个。这个概率在工程上完全够用。3. 别用除法用查表CRC在单片机上的真实活法3.1 逐位计算慢在哪如果真按模2除法去实现CRC每处理1个比特就要做一次移位和条件异或。一个Modbus RTU报文通常十几字节算下来上百个比特就是上百次循环。在PC上这不算什么但在老式8位单片机、或者实时性要求很高的中断处理流程里每个微秒都很关键。而且更麻烦的是逐位算法的循环次数不稳定容易被看门狗打断也容易被优化器搞出幺蛾子。工程上几乎没人用纯逐位算法做生产代码大家普遍用查表法预先把全部可能的输入组合对应的CRC结果算好存成一张256项的表格运行时每处理一个字节只需要查一次表做一两次异或和移位。速度是逐位算法的8倍——毕竟一次处理8个比特。3.2 查表法的核心思想一次算一字节查表的原理建立在CRC算法的线性性质上。当前CRC寄存器值的高8位和下个输入字节做个异或然后作为索引去查表表的每一项已经预计算好了这一字节进来后的综合影响。你不用关心中间那8次移位具体是怎么走的表已经把结果浓缩好了。以Modbus RTU用的CRC-16/Modbus算法为例它的实现是这样的uint16_t crc16_modbus(const uint8_t *data, size_t len) { uint16_t crc 0xFFFF; for (size_t i 0; i len; i) { crc ^ data[i]; for (int j 0; j 8; j) { if (crc 1) crc (crc 1) ^ 0xA001; // 0xA001是0x8005的反射多项式 else crc 1; } } return crc; }这段逐位代码中的0xA001就是CRC-16/Modbus多项式0x8005按位倒序后的结果因为Modbus算法是LSB-first低位先处理多项式也要跟着反射。查表版则是把内层循环换成一次查表static const uint16_t table[256]; // 预先算好 uint16_t crc16_modbus_table(const uint8_t *data, size_t len) { uint16_t crc 0xFFFF; for (size_t i 0; i len; i) { crc (crc 8) ^ table[(crc ^ data[i]) 0xFF]; } return crc; }3.3 建立查表一张256项的表格怎么生成查表法慢不慢关键看表的生成方式。有人喜欢写死一个大数组可读性差出现拼写错误很难查。我更推荐在程序启动时动态生成也就256次循环一次运行算一次之后永久使用。void init_crc16_table(uint16_t table[256]) { for (int i 0; i 256; i) { uint16_t crc i; for (int j 0; j 8; j) { if (crc 1) crc (crc 1) ^ 0xA001; else crc 1; } table[i] crc; } }建表思路就是把索引值当成一个假的CRC寄存器初始值跑8次逐位计算得到一个基准值。运行时查表的索引值实际是(crc ^ data[i]) 0xFF这就把前一字节的影响和新字节的影响融合在了一起。为什么能这样融合因为CRC在数学上是线性的异或运算满足交换律和结合律先异或后处理与先处理后异或效果相同。你要是第一次接触这句话别纠结直接用等你看多了CRC的代码自然就懂了。3.4 主流CRC变体别把CRC-16和CRC-16/Modbus混为一谈写CRC程序最容易翻车的地方就是听说对方用CRC-16就直接拿一段CRC-16/CCITT代码顶上。不同变体的差异主要在多项式、初值、结果异或、输入数据是否按位反射这几个参数上。我列一个常用的对照表建议收藏算法多项式完整初值结果异或输入/输出反射典型应用CRC-8/SMBUS0x1070x000x00否/否SMBus、I2CCRC-16/MODBUS0x80050xFFFF0x0000是/是Modbus RTUCRC-16/CCITT-FALSE0x10210xFFFF0x0000否/否X.25、蓝牙CRC-320x04C11DB70xFFFFFFFF0xFFFFFFFF是/是ZIP、以太网FCS输入/输出反射是CRC协议里一个极容易忽略的参数。反射的意思是处理一个字节时从最低位开始处理而不是从最高位开始。以太网FCS就是反射处理的Modbus也是。你拿着非反射算法去算Modbus报文算出来肯定不对。3.5 网上那些CRC计算动图到底在看什么热搜里有一组很火的CRC校验计算动图一堆寄存器方块在移位、异或门在闪烁。很多人看半天只觉得像流水灯没有抓住要领。动图在演示的其实是三步数据位从一边进入移位寄存器每移入一位寄存器整体右移或左移一格当寄存器最高位或最低位是1时触发一次和多项式的异或相当于做减法。看动图时你只需要注意三点数据是从哪边进去的决定要不要反射、触发异或的条件是什么看最高位还是最低位、异或后寄存器发生了什么。只要搞清这三件事动图就变成了一个非常直观的硬件电路示意图。在我接触过的项目里真有用FPGA直接搭CRC硬核的那基本就是把动图变成了电路。4. 报文、PLC和手机压缩包CRC的三种现场执法4.1 通过报文观察CRCModbus RTU帧的尾巴先说Modbus RTU这是工业现场最容易见到CRC的地方。一个标准Modbus RTU请求帧是从站地址(1字节) 功能码(1字节) 数据(若干字节) CRC16(2字节低字节在前)。拿前面PH计的例子主站要读从站1的保持寄存器起始地址0数量2报文是01 03 00 00 00 02。算出来的CRC-16/Modbus是0xC40B由于Modbus规定低字节在前所以实际线路上发送的是01 03 00 00 00 02 0B C4。怎么验证自己算得对不对很简单把01 03 00 00 00 02 0B C4这8个字节整个喂给CRC-16/Modbus算法算出来的结果必须是0x0000。余数为0说明报文完整且CRC位置正确。这是任何CRC协议里最通用的验证方式。在Wireshark里看Modbus TCP抓包时是看不到CRC的——TCP协议栈已经不包含串口帧的CRC了CRC在TCP层被TCP校验和替代。只有抓Modbus RTU串口数据比如用串口服务器的透传抓包才能看到帧尾的CRC字节。做上位机协议解析时我习惯直接在解析器里同时输出CRC是否通过的标记省得每次手工比对。4.2 从以太网帧观察FCSCRC-32在链路层的执法以太网帧格式里FCS在帧尾共4字节由目的MAC地址、源MAC地址、类型/长度字段、以及上层数据IP包、ARP包等共同参与计算。接收方网卡硬件完成CRC-32计算如果与FCS不匹配帧直接丢弃不会交给上层协议栈。这就是为什么物理链路偶尔有干扰时你会看到TCP层丢包重传但应用层毫无感知——因为坏帧根本没有到达IP层。Wireshark抓包时有个细节普通有线网卡抓包默认剥离FCS你看到的帧通常没有最后4字节。但802.11无线抓包有时能抓到带FCS的帧。如果你在Wireshark里看到类似bad FCS或frame check sequence error的标记首先要检查是否是无线抓包或某些网卡的混杂模式设置然后检查线路干扰。数据帧的CRC-32覆盖范围是从帧头到数据字段末尾在做网络协议分析时要清楚哪些字节在FCS计算范围内才能正确判断抓到的报文是否被截断。4.3 S7-200 SMART里的CRC校验程序怎么做很多做PLC的人问S7-200 SMART怎么实现CRC因为它的指令集里没有现成的CRC指令不像三菱某些系列有专门的校验指令。S7-200 SMART能用的办法是逐位移位加异或配合查表也可以。我给出一个逐位实现的思路比较直观假设报文数据依次存放在VB100开始的连续地址中字节数存放在VB99。CRC结果放在VW90里。初始化 VW90 : 16#FFFF 对每个数据字节循环VB99次 VW90 的低字节 异或 该数据字节 然后重复8次 判断VW90最低位是否为1 如果最低位为1 VW90右移1位 VW90异或16#A001 否则 VW90右移1位在梯形图里实现时右移可以用SHR_W指令移出的最低位会进入特殊存储器位SM1.1用SM1.1作为分支条件去判断要不要异或0xA001。这个方案扫描周期大约几十微秒对Modbus RTU的十几字节报文完全够用。如果报文更长、或者要求毫秒级响应可以改用查表法但S7-200 SMART的程序空间有限查表256个字的表在V区也占约512字节要看具体机型余量再决定。4.4 ZArchiver的CRC错误文件级别的CRC-32排查思路ZIP压缩包在文件头里存储了每个文件的CRC-32ZArchiver解压时重新计算解压后数据的CRC-32并与存储值比对。出现CRC错误首要排查步骤是换一个渠道重新下载比如换浏览器、换镜像源、用文件管理器的断点续传。下载工具如果支持校验下载完先比对一次哈希值再解压能大幅减少这种问题。我试过一次特别迷惑的情况同一个ZIP包在电脑上解压没问题传到手机里就CRC错误。最后发现是U盘拷贝时文件系统缓存异常拷贝过程数据实际发生了损坏。这个教训告诉我当CRC错误反复出现在同一文件时大概率是存储介质的问题别怀疑解压软件先换个U盘或换条数据线。4.5 CRC校验在文件存档里的特殊价值文件压缩场景还隐藏着一个CRC的工程细节压缩包内部文件很大如果等整个文件解压完再校验损坏的数据可能已经写进磁盘。所以像ZArchiver这种工具是边解压边计算CRC发现不匹配立刻中断能避免把损坏数据写入用户目录。这和以太网、Modbus的校验完再放行是一样的设计哲学——能提前拦截就不把脏数据留到后面。5. CRC实现避坑自检清单五个最容易错的地方5.1 初值0x0000还是0xFFFF不是随便写的CRC-16/Modbus的初值是0xFFFF而CRC-16/IBM的初值是0x0000。别看只差一个初值结果完全不同。当初值全0时如果数据前面补了几个0CRC结果不变但如果初值是全1即使数据全是0CRC也有一个确定的非零输出。设计者把初值设为全1是为了检测出数据开头丢失的0字节这类错误。实际编程时多花10秒钟确认协议文档里写的初值比事后调试半天高效得多。判断初值是否正确的方法仍然是完整报文再算一次CRC看是否为0。如果在接收模式里用初值0x0000验证Modbus报文得到的结果几乎不可能为0。这时候先怀疑初值再怀疑反射设置顺序不要反。5.2 字节序CRC结果放哪个方向CRC算出来是一个16位或32位数但放报文的顺序因协议而异。Modbus RTU低字节在前所以0xC40B要发成0B C4。以太网FCS则是在字节层面按位序的不是简单地高字节在前要看具体协议文档的位序定义。文件格式里的CRC字段位置也各不相同ZIP文件的本地文件头里CRC-32字段是标准小端序。最稳妥的验证方法就是全报文重算为0那个方法。你先把CRC按你理解的顺序放进报文然后对整个报文重新计算CRC。如果得到0说明你的字节序和协议一致如果得到其他值大概率是顺序反了或者计算范围不对。5.3 计算范围CRC到底覆盖哪些字节CRC覆盖范围的错误是隐蔽性最高的坑。Modbus RTU的CRC覆盖从地址字节到数据域最后一个字节但不包括CRC本身。以太网FCS覆盖除前导码和FCS本身以外的所有帧字段。ZIP文件的CRC覆盖压缩后的文件数据不包括文件名、注释等元数据。一次现场调试我用示波器对比了两个正常主机发出的Modbus帧同样一条报文一个从站能正常回复另一个从站总报异常。抓出来才发现是我给备用主机写的解析程序把CRC计算范围算进去了设备地址字段之前的一个空闲填充字节。这种错误在报文级别非常难用人眼发现必须依赖功能码的请求响应行为来判断。5.4 什么时候CRC救不了你CRC是检错码不是纠错码也不是安全校验。它检测随机传输错误的效率很高但有三个局限如果数据被恶意篡改攻击者可以同步重新计算CRC接收方无法察觉。防篡改必须用消息认证码或数字签名。CRC多项式存在理论上的碰撞概率。32位CRC在完全随机的错误模式下大约每2^32个错误里有1个能恰好满足整除条件而不被发现。对绝大多数工程场景1/40亿的漏检率可接受但如果你做的是银行转账、介质校验这种高可靠性场景可以叠加多个CRC变体或改用更强的摘要算法。CRC只能检错不能告诉我们哪一位错了。真正做纠错是另一套体系比如RS码、汉明码它们比CRC复杂得多。5.5 一个通用自检技巧把CRC结果重新送入CRC最后分享一个我屡试不爽的验证策略。写任何CRC程序都先做三个自检用在线工具或别人验证过的参考代码算一个已知报文的CRC对比结果。把CRC按协议的字节序追加到原报文尾部对整个扩展后的报文重新调用CRC算法确认输出为0对Modbus这类结果异或为0的算法适用。篡改数据里的任意一个比特再算CRC确认结果发生变化。第一项确认算法参数正确第二项确认字节序和范围正确第三项确认程序不是死循环返回固定值。这三步走完CRC程序基本不会出问题。我在实际项目中还习惯在工程里保留一组黄金测试向量每次把CRC代码移植到新平台比如从STM32挪到S7-200 SMART第一件事就是把这组向量跑一遍。这个习惯帮我避过好几次坑——有一次就是不注意新平台的字节序和编译器对齐方式导致查表法结果对不上黄金向量直接定位到了问题。CRC这个领域表面几句话能说完实际项目里全是细节。希望这篇内容能让你少踩几个我当年踩过的坑。
企业数字化 ERP 产品动态
相关推荐
VisDrone转COCO格式JSON:目标检测数据集标注转换实践与避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:08:20
STM8开发环境搭建全攻略:从STVD到Cosmic配置与避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:08:14
VOFA-NEXT:基于Rust+TAURI的节点化串口调试平台 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:08:14
车载以太网休眠唤醒验证:Kvaser Arcus三种部署形态与TC10实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:48:52
Chrome被劫持修复指南:从原理到清理2024导航劫持木马完整方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:48:52
基于secs4net的Secs/Gem设备主机端通信架构实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:48:52
VS2019 DLL动态库创建与调用配置:三步链接与避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:48:46
中兴通讯校招薪资全拆解:岗位、城市、评级如何影响你的offer /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:48:40
XL2417D:2.4G高集成SoC实现300–700米低功耗无线通信 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:48:40
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01