【ARM 安全系列介绍 1 -- 奇偶校验与海明码校验详细介绍】
文章目录
- 奇偶校验介绍
- 奇偶校验 python 实现
- 奇偶校验C代码实现
- 海明码详细介绍
奇偶校验介绍
奇偶校验是一种错误检测方法,广泛应用于计算机内部以及数据通信领域。其基本原理是为了使得一组数据(通常是一字节8位)中的“1”的个数为偶数或奇数。
奇偶校验分为两种:
- 偶校验:确保数据中“
1”的个数为偶数。如果“1”的个数是奇数,则添加一个“1”进行校验;如果“1”的个数已经是偶数,则添加一个“0”进行校验。 - 奇校验:确保数据中“
1”的个数为奇数。如果“1”的个数是偶数,则添加一个“1”进行校验;如果“1”的个数已经是奇数,则添加一个“0”进行校验。
举个例子:
比如我们有一个字节的数据,二进制表示为1001 1100(十六进制为9C)。这个字节中“1”的个数为4,是偶数。
- 如果我们要进行偶校验,由于“
1”的个数已经是偶数,所以我们添加一个“0”,得到的校验字节为1001 1100 0(十六进制为138)。 - 如果我们要进行奇校验,由于“
1”的个数是偶数,所以我们添加一个“1”,得到的校验字节为1001 1100 1(十六进制为139)。
当接收方收到校验字节后,就可以通过计算“1”的个数来判断数据是否出现错误。如果接收到的字节中“1”的个数与预期(偶数或奇数)不符,就可以认为数据在传输过程中可能出现了错误。
需要注意的是,奇偶校验只能检测出单个位的错误,如果多个位同时出错,可能会导致错误无法被检测出来。
奇偶校验 python 实现
在串行通信中,奇偶校验被用于错误检测。但是值得注意的是,Linux系统并没有直接可以进行奇偶校验的命令。你可能需要使用其他工具或语言(如awk,perl,python等)来实现奇偶校验操作。这些操作通常涉及到二进制数的处理和位操作。
例如,下面的 Python 脚本可以计算一个文件的奇偶校验:
def parity_of(int_type): parity = 0 while (int_type): parity = ~parity int_type = int_type & (int_type - 1) return(parity) filename = 'yourfile'
with open(filename, 'rb') as f: c = f.read(1) while c: print(parity_of(ord(c))) c = f.read(1)
这个脚本会读取文件 ‘yourfile’,然后逐字节计算奇偶校验,并输出结果。如果结果为0,表示该字节中有偶数个1;如果结果为-1,表示该字节中有奇数个1。
奇偶校验C代码实现
#include <stdio.h> unsigned int parity(unsigned int n)
{ unsigned int parity = 0; while (n) { parity = !parity; n = n & (n - 1); } return parity;
} int main(void)
{ unsigned int n; printf("Enter a number: "); scanf("%u", &n); printf("Parity of number %u is %s\n", n, (parity(n)? "odd": "even")); return 0;
}
上述代码首先会询问用户输入一个数字,然后计算该数字的偶校验。如果该数字的二进制表示中 ‘1’ 的个数是奇数,则它的偶校验就是奇数,反之则为偶数。
对于奇校验,只需稍微修改一下上述代码即可:
#include <stdio.h> unsigned int parity(unsigned int n)
{ unsigned int parity = 1; // 修改这里 while (n) { parity = !parity; n = n & (n - 1); } return parity;
} int main(void)
{ unsigned int n; printf("Enter a number: "); scanf("%u", &n); printf("Parity of number %u is %s\n", n, (parity(n)? "odd": "even")); return 0;
}
现在,如果输入的数字的二进制表示中 ‘1’ 的个数是奇数,则其奇校验就是偶数,反之则为奇数。
海明码详细介绍
海明码(Hamming code)是一种错误检测和纠正的编码方式,由美国数学家理查德·海明于1950年代早期提出。
海明码的核心思想是在数据位中插入多个校验位,这些校验位覆盖的数据位范围有所重叠,使得任何一个位的错误都能被至少两个校验位所发现。通过这种方式,如果某一位发生错误,可以通过查看所有的校验位来确定出错的是哪一位,从而达到纠错的目的。
具体来说,对于长度为 m 的信息位,我们需要添加r个校验位,其中 r 是满足: 2rr >= m + r + 1 的最小整数。例如,对于长度为4位的信息位,我们需要添加3位校验位,因为 23 = 8 >= 4 + 3 + 1。
在确定了校验位数量后,我们需要确定每个校验位的位置以及它们应该覆盖的数据位。这个过程有一定的规则可循:首先,把校验位放在2的整数幂的位置(1,2,4,8…等等);然后,每个校验位覆盖的数据位是从该校验位的位置开始,覆盖相应的位数,然后跳过相同的位数,再覆盖相同的位数,以此类推。比如,位置在 2 的 n 次方的校验位,会覆盖从位置 n 开始的每隔 n个位。
生成了校验位之后,接收端可以通过检查每个校验位来确定是否有错误,以及错误在哪一位。如果所有的校验位都是正确的,那么数据没有错误;如果某些校验位错误,那么错误的位置就是这些错误校验位的位置之和。例如,如果位置2和位置4的校验位错误,那么错误的数据位就是位置 2+4=6。
海明码虽然只能纠正单个位的错误,但它的优点是实现简单,计算量小,适用于需要实时纠错的场景。
相关文章:
【ARM 安全系列介绍 1 -- 奇偶校验与海明码校验详细介绍】
文章目录 奇偶校验介绍奇偶校验 python 实现奇偶校验C代码实现 海明码详细介绍 奇偶校验介绍 奇偶校验是一种错误检测方法,广泛应用于计算机内部以及数据通信领域。其基本原理是为了使得一组数据(通常是一字节8位)中的“1”的个数为偶数或奇…...
分享34个发布商会PPT,总有一款适合您
分享34个发布商会PPT,总有一款适合您 链接:https://pan.baidu.com/s/1jP9toqTZONWeDIcxvw1wxg?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易。知识付费甚…...
047_第三代软件开发-日志分离
第三代软件开发-日志分离 文章目录 第三代软件开发-日志分离项目介绍日志分离用法 关键字: Qt、 Qml、 log、 日志、 分离 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C 的强…...
ChinaSoft 论坛巡礼 | 系统与网络安全论坛
2023年CCF中国软件大会(CCF ChinaSoft 2023)由CCF主办,CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办,将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…...
Ubuntu Gitlab安javascript:void(‘numberedlist‘)装
原因: 代码越改越多,越难维护,开发代码和发布代码融为一体;2人以上开发,都会修改代码,修改次数一多,代码难以维护 其中:前往Gitlab官网:gitlab/gitlab-ce - Packages pa…...
11.4-GPT4AllTools版本已开始对小部分GPT3.5用户内测推送
OpenAI已经开始小规模推送GPT4 AllTools功能,部分GPT博主已经第一时间体验了此功能,此功能特色是整合目前的多模态功能以及文件上传和联网模块,无需切换,更要全面综合 可上传包括 PDF、数据文件在内的任意文档,并进行分…...
竞赛选题 深度学习手势检测与识别算法 - opencv python
文章目录 0 前言1 实现效果2 技术原理2.1 手部检测2.1.1 基于肤色空间的手势检测方法2.1.2 基于运动的手势检测方法2.1.3 基于边缘的手势检测方法2.1.4 基于模板的手势检测方法2.1.5 基于机器学习的手势检测方法 3 手部识别3.1 SSD网络3.2 数据集3.3 最终改进的网络结构 4 最后…...
语言模型AI——聊聊GPT使用情形与影响
GPT的出现象征着人工智能自然语言处理技术的一次巨大飞跃。从编程助手到写作利器,它的身影在各个行业中越来越常见。百度【文心一言】、CSDN【C知道】等基于GPT的产品相继推出,让我们看到了其广泛的应用前景。然而,随着GPT的普及,…...
浅谈事件冒泡和事件捕获
事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题。 <div id"div1"><div id"div2"><div id"div3">click</div></div> <…...
CSS 背景、文本、字体
CSS背景: CSS背景属性用于定义HTML元素的背景。CSS属性定义背景效果:background-color;background-image;background-repeat;background-attachment;background-position。 background-color属性定义元素…...
爬取Elastic Stack采集的Nginx内容
以下是一个简单的Go语言爬虫程序,用于爬取Elastic Stack采集的Nginx内容。请注意,这只是一个基本的示例,实际使用时可能需要根据具体情况进行修改和扩展。 package mainimport ("fmt""net/http""io/ioutil" )…...
python 机器学习 常用函数
一 np.random.randint "randint" 是 "random integer" 的缩写,表示生成随机整数。 np.random.randint 是 NumPy 库中的一个函数,用于生成随机整数。以下是该函数的一般语法: np.random.randint(low, high, size)其中…...
手写操作系统篇:环境配置
文章目录 前言C环境配置Rust环境配置Qemu安装 前言 这篇博客先配置好我们之后的开发环境,下载一些依赖的软件包 建议大家使用ubuntu操作系统 C环境配置 sudo apt-get update && sudo apt-get upgrade sudo apt-get install git wget build-essential gdb…...
地理信息系统原理-空间数据结构(7)
四叉树编码 1.四叉树编码定义 四叉树数据结构是一种对栅格数据的压缩编码方法,其基本思想是将一幅栅格数据层或图像等分为四部分,逐块检查其格网属性值(或灰度);如果某个子区的所有格网值都具有相同的值࿰…...
三国志14信息查询小程序(历史武将信息一览)制作更新过程03-主要页面的设计
1,小程序的默认显示 分为三部分,头部的标题、中间的内容区和底部的标签栏。点击标签可以切换不同页面,这是在app.json文件中配置的。代码如下: //所有用到的页面都需要在 pages 数组中列出,否则小程序可能会出现错误或…...
学习Opencv(蝴蝶书/C++)相关——2.用clang++或g++命令行编译程序
文章目录 1. c/cpp程序的执行1.1 cpp程序的编译过程1.2 预处理指令1.3 编译过程的细节2. macOS下使用Clang看cpp程序的编译过程2.1 示例2.1.1 第一步 预处理器-preprocessor2.1.2 第二步 编译器-compiler2.1.3 第三步 汇编器-assembler2.1.4 第四步 链接器-linker2.1.5 链接其他…...
【Unity细节】VS不能附加到Unity程序中解决方法大全
👨💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶🌫️收录于专栏:unity细节和bug 😶🌫️优质专栏 ⭐【…...
线上 kafka rebalance 解决
上周末我们服务上线完毕之后发生了一个kafka相关的异常,线上的kafka频繁的rebalance,详细的报错我已经贴到下面,根据字面意思:消费者异常 org.apache.kafka.clients.consumer.CommitFailedException: 无法完成提交,因为…...
[100天算法】-第一个错误的版本(day 62)
题目描述 你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, ..., n],你…...
React 学习系列: 类组件生命周期方法
类组件生命周期方法 constructor 在类组件挂载的时候调用,用于构建一个类组件实例。 在构建类组件实例的时候, 会先执行基类构造函数( React.Component ) 使用父组件传入的 props 来初始化 props 属性, 然后执行自定义构造函数来初始化 state…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
