计算器系统基础知识-校验码
1.奇偶校验码
通过在编码中增加一位奇数校验位来使编码中1的个数为奇数(奇校验)或者为偶数(偶校验),从而使码距变为2。
常见的奇偶校验码有三种:水平奇偶校验码、垂直奇偶校验码和水平垂直校验码。
以下是奇偶校验码的示例:
public class ParityCheck {public static String generateOddParity(String data) {StringBuilder parity = new StringBuilder();for (int i = 0; i < data.length(); i++) {int par = 0; // 记录奇数位的个数for (int j = 0; j < 8; j++) {if (((data.charAt(i) >> j) & 1) == 1) {par++;}}parity.append((par % 2 == 0) ? '0' : '1'); // 如果奇数位个数为偶数则补1,否则补0}return parity.toString();}public static String generateEvenParity(String data) {StringBuilder parity = new StringBuilder();for (int i = 0; i < data.length(); i++) {int par = 0; // 记录偶数位的个数for (int j = 0; j < 8; j++) {if (((data.charAt(i) >> j) & 1) == 1) {par++;}}parity.append((par % 2 == 0) ? '0' : '1'); // 如果偶数位个数为偶数则补1,否则补0}return parity.toString();}public static void main(String[] args) {String data = "Hello"; // 示例数据String oddParity = generateOddParity(data);String evenParity = generateEvenParity(data);System.out.println("Odd Parity: " + oddParity);System.out.println("Even Parity: " + evenParity);}
}
2.海明码
海明码是由贝尔实验室的Richard Hamming设计的,是一种利用奇偶性来检错和纠错的校验方法。海明码的构成方法是在数据位之间的特定位置上插入K个校验位,通过扩大码距来实现检错和纠错。
设数据位为n位,校验位为k位,则n和k必须满足以下关系:
2 k − 1 > = n + k 2^k-1>=n+k 2k−1>=n+k
public class HammingCode {// 计算海明码的位数public static int calculateHammingCodeLength(int dataBits, int parityBits) {return dataBits + parityBits;}// 生成海明码public static int[] generateHammingCode(int[] dataCode, int[] parityCode, int[] hammingCode, int dataBits, int parityBits) {for (int i = 0; i < dataBits; i++) {hammingCode[i] = dataCode[i];}for (int i = 0; i < parityBits; i++) {hammingCode[dataBits + i] = parityCode[i];}return hammingCode;}// 检查海明码是否有错误public static boolean checkHammingCode(int[] hammingCode, int dataBits, int parityBits) {for (int i = 0; i < parityBits; i++) {int mask = 1 << (dataBits + i);int sum = 0;for (int j = 0; j < dataBits; j++) {if ((hammingCode[j] & mask) != 0) {sum++;}}if (sum % 2 != hammingCode[dataBits + i]) {return false;}}return true;}// 纠错海明码public static boolean correctHammingCode(int[] hammingCode, int dataBits, int parityBits) {for (int i = 0; i < parityBits; i++) {int mask = 1 << (dataBits + i);int sum = 0;for (int j = 0; j < dataBits; j++) {if ((hammingCode[j] & mask) != 0) {sum++;}}if (sum % 2 != hammingCode[dataBits + i]) {hammingCode[dataBits + i] = 1 - hammingCode[dataBits + i]; // 翻转错误位return true;}}return false;}public static void main(String[] args) {int dataBits = 3; // 数据位数int parityBits = 2; // 奇偶校验位数int totalBits = calculateHammingCodeLength(dataBits, parityBits);int[] dataCode = {0, 0, 1}; // 数据码字int[] parityCode = new int[parityBits]; // 奇偶校验码字int[] hammingCode = new int[totalBits]; // 海明码// 生成海明码generateHammingCode(dataCode, parityCode, hammingCode, dataBits, parityBits);// 检查海明码是否有错误boolean isValid = checkHammingCode(hammingCode, dataBits, parityBits);System.out.println("Is the Hamming Code valid? " + isValid);// 模拟一位错误hammingCode[1] = 1 - hammingCode[1];// 纠错海明码boolean isCorrected = correctHammingCode(hammingCode, dataBits, parityBits);System.out.println("Was the error corrected? " + isCorrected);// 打印纠正后的海明码for (int code : hammingCode) {System.out.print(code);}}
}
3.循环冗余校验码
循环冗余校验码(又叫CRC校验码)广泛应用于数据通信领域和磁介质存储系统中。它利用生成多项式为k个数据位产生r个校验码来进行编码。循环冗余校验码由两部分组成,一部分为信息码,另一部分为校验码。如果信息码占 k k k位,则校验码就占 n − k n-k n−k位,其中,n为CRC码的字长,所以又称为 ( n , k ) (n,k) (n,k)码。在求CRC编码时,采用的是模2运算,模2加减运算的规则是按位运算,不发生错位和进位。
CRC校验码常用的类别有以下几种:
(1)CRC-8: 生成多项式为 X 8 + X 2 + X + 1 X8+X2+X+1 X8+X2+X+1
(2)CRC-16: 生成多项式为 X 16 + X 15 + X 2 + 1 X16+X15+X2+1 X16+X15+X2+1,一般常用于modbus协议
(3)CRC-32:生成多项式为: X 32 + X 26 + X 23 + X 22 + X 16 + X 12 + X 11 + X 10 + X 8 + X 7 + X 5 + X 4 + X 2 + X + 1 X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1 X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1,一般常用于ZIP, RAR, IEEE 802 LAN/FDDI等。
以下是关于CRC-16的应用示例:
import java.nio.charset.StandardCharsets;public class CRC16 {public static int crc16Ccitt(byte[] data) {int crc = 0xFFFF; // 初始值for (byte b : data) {for (int i = 0; i < 8; i++) {boolean bit = ((b >> (7 - i) & 1) == 1);boolean c15 = ((crc >> 15 & 1) == 1);crc <<= 1;if (c15 ^ bit) {crc ^= 0x1021; // CRC-CCITT多项式}}}return crc & 0xFFFF; // 确保结果是16位}public static void main(String[] args) {String data = "Hello, CRC!";int crc = crc16Ccitt(data.getBytes(StandardCharsets.UTF_8));String hexCrc = Integer.toHexString(crc);System.out.println("CRC16-CCITT Checksum: " + (hexCrc.length() == 4 ? "0x" + hexCrc : hexCrc));}
}
相关文章:
计算器系统基础知识-校验码
1.奇偶校验码 通过在编码中增加一位奇数校验位来使编码中1的个数为奇数(奇校验)或者为偶数(偶校验),从而使码距变为2。 常见的奇偶校验码有三种:水平奇偶校验码、垂直奇偶校验码和水平垂直校验码。 以下是奇偶校验码的示例: public …...
springboot换日志框架后爆SLF4J: Class path contains multiple SLF4J bindings的解决办法
sringboot原本使用的是logback日志框架,将它去掉,修改为log4j2日志框架后,往往会出现以下错误: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/C:/Users/admin/.m2/repository/ch/qos…...
k8s+zabbix
一,环境: 1),k8s部署,master和node节点都部署成功 二,部署: 1),安装python3(资源中有) wget https://www.python.org/ftp/python/3.7.4/Python-…...
k8s-生产级的k8s高可用(2) 25
部署containerd k8s2、k8s3、k8s4在配置前需要重置节点(reset)在上一章已完成 禁用所有节点docker和cri-docker服务 所有节点清除iptables规则 重置后全部节点重启 由于之前部署过docker,因此containerd默认已安装 修改配置 启动containe…...
ubuntu20.04 创建ros环境、创建rospackage
roswiki教程:https://wiki.ros.org/cn/ROS/Tutorials 环境准备 安装ros环境 这里选择noetic版本的ros,安装步骤参考:https://zhuanlan.zhihu.com/p/662284005 创建工作空间 这里我在用户目录下创建catkin的工作目录catkin_ws ࿰…...
QT进阶---------pro项目文件中的常用命令 (第三天)
1、命令一 决定exe可执行程序的生成路径CONFIG 作用:不使用默认路径,方便移植 CONFIG(debug, debug|release) {DESTDIR $$_PRO_FILE_PWD_/../../../debugXXXsystem } else {DESTDIR $$_PRO_FILE_PWD_/../../../realeaseXXXsystem } 是用于 Qt 项目…...
php常用设计模式应用场景及示例
单例模式 含义描述 应用程序中最多只有该类的一个实例存在 应用场景 常应用于数据库类设计,采用单例模式,只连接一次数据库,防止打开多个数据库连接。 代码示例 class Singleton {private static $instance; // 定义一个私有的静态变量保存…...
浏览器与服务器通信过程(HTTP协议)
目录 1 概念 2 常见的 web 服务器有 3 浏览器与服务器通信过程 3.1 DNS 3.2 URL 4 HTTP请求方法和应答状态码 4.1 HTTP请求报文段实例 4.2 HTTP请求方法 5 HTTP应答报头和应答状态 5.1 HTTP的应答报头结构 5.2 HTTP的应答状态 1 概念 浏览器与 web 服务器在应用层通…...
Pytorch搭建AlexNet 预测实现
1.导包 import torch import matplotlib.pyplot as plt import json from model import AlexNet from PIL import Image from torchvision import transforms 2.数据预处理 data_transform transforms.Compose([transforms.Resize((224, 224)), # 将图片重新裁剪transform…...
笔记:使用parfile进行的数据导入导出
expdp ‘username/password’ parfileE:\dmp_tmp\par.txt DIRECTORYdmptmp LOGFILESYS_SEND_LOG.log DUMPFILESYS_SEND_LOG.dmp tablesSYS_SEND_LOG_BAK query“where send_dt>TO_DATE(‘2024-03-13’,‘yyyy-mm-dd’)” impdp ‘username/password’ directorydmptmp dum…...
基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的行人跌倒检测系统(深度学习+UI界面+完整训练数据集)
摘要:开发行人跌倒检测系统在确保老年人安全方面扮演着至关重要的角色。本篇文章详尽地阐述了如何利用深度学习技术构建一个行人跌倒检测系统,并附上了完整的代码实现。该系统采用了先进的YOLOv8算法,并对YOLOv7、YOLOv6、YOLOv5等先前版本进…...
Ubuntu 14.04:PaddleOCR基于PaddleServing的在线服务化部署(失败)
一、 二、安装 注: 安装 PaddleOCR 2.3 。 因为 PaddleOCR 2.4 的 推荐环境 PaddlePaddle > 2.1.2。 https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.4/doc/doc_ch/environment.md 安装前的环境准备 在使用Paddle Serving之前,需要完…...
Java JUC 笔记(2)
Java JUC 笔记(2) 锁框架 JDK5以后增加了Lock接口用来实现锁功能,其提供了与synchronized类似的同步功能,但是在使用时手动的获取和释放锁 Lock和Condition锁 这里的锁与synchronized锁不太一样,我们可以认为是Loc…...
webpack5高级--02_提升打包构建速度
提升打包构建速度 一、HotModuleReplacement 为什么 开发时我们修改了其中一个模块代码,Webpack 默认会将所有模块全部重新打包编译,速度很慢。 所以我们需要做到修改某个模块代码,就只有这个模块代码需要重新打包编译,其他模…...
MAC M芯片 Anaconda安装
Anaconda安装 1.M芯片下载AnaConda 1.M芯片下载AnaConda https://www.anaconda.com/download 安装完成 conda的版本是24.1.2...
【JS】自动下拉网页刷新,当出现指定关键字,就打印出来
批量检查域名是否可以注册 1、有的网站数据是通过下拉发生请求,间隔x毫秒自动下拉 2、查找某个关键字,找到就打印出来 3、打印数据自动去重 4、当连续n次下拉,没有新div元素出来,就停止该循环 var map {}; var count 0; var l…...
中兴通讯联手新疆移动,开通全疆首个乡农场景700M+900M双频双模基站
日前,在新疆博尔塔拉蒙古自治州,中兴通讯携手新疆移动共同完成了全疆首个乡农场景的700M900M双频双模基站建设,其通过采用“700M与900M共天馈共RRU设备”,成功实现乡农4/5G网络的同站址快速部署,为新疆的农牧业发展注入…...
爬虫案例4: parsel 模块的运用
目标页面: https://www.shanghairanking.cn/rankings/bcur/2023 打印在终端import requests import json from urllib.parse import urljoin from parsel import Selectorurl https://www.shanghairanking.cn/rankings/bcur/2023headers {User-Agent: Mozilla/5.0 (Macintosh…...
数据结构·复杂度
目录 1 时间复杂度 2 大O渐进表示法 举例子(计算时间复杂度为多少) 3 空间复杂度 前言:复杂度分为时间复杂度和空间复杂度,两者是不同维度的,所以比较不会放在一起比较,但是时间复杂度和空间复杂度是用…...
数学建模理论与实践国防科大版
目录 1.数学建模概论 2.生活中的数学建模 2.1.行走步长问题 2.2.雨中行走问题 2.3.抽奖策略 2.4.《非诚勿扰》女生的“最优选择” 3.集体决策模型 3.1.简单多数规则 3.2.Borda数规则 3.3.群体决策模型公理和阿罗定理 1.数学建模概论 1.数学模型的概念 2.数学建模的概…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
