Windows程序员必须掌握的计算机编码问题——海明码(通俗易懂)

2023-11-19


我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下计算机中的编码问题,来看第二部分,海明码。

 

很多初学者一看到海明码就郁闷,因为课本上关于海明码的描述实在是太难懂了。那就跟随我一起来搞懂海明码,我用最简单最好懂的方式描述,我不会使用高深的数学术语,你一定能看懂。

先耐心看完下面这几段,这是理解的基础。假设1帧包含m个数据位(报文数据位)和r个冗余位(校验位),则帧的长度n=m+r。这n位单元通常称为n位码字。

海明码距(码距)是两个码字中不相同的二进制位的个数,两个码字的码距是一个编码系统中任意两个合法编码(码字)之间不同的二进制数的位数,编码系统的雄踞是整个编码系统中任意两个码字的码距的最小值。误码率是传输错误的比特占所传输比特总数的比率。好了,看了这里估计有人已经要放弃了,我们换个通俗易懂的理解。

假如你设计一个编码系统,用两个比特位表示4个不同的信息,如下:信息0用00表示,信息1用01表示,信息2用10表示,信息3用11表示。任意两个码字之间不同的比特位数为1或者2,最小值为1,,故该编码系统的码距为1。即使码字中的任何一位或者多位出错了,结果中的码字也仍然是合法码字。比如,如果传送信息10,出错了变成11了,但由于11还是属于合法码字,所以接收方仍然认为11是正确的信息。这样就无法知道传输是否出问题了。

但是,如果用3个二进位来编4个码字,那么码字间的最小距离可以增加到2,如下:信息0用000表示,信息1用011表示,信息2用101表示,信息3用110表示。这里任意两个码字相互间最小有两个比特位的差异。因此,如果任何信息中的一个比特位出错,那么将成为一个不用的码字,接收方能检查出来。例如信息是110,因出错成为了100,但100不是合法码字,这样接收方就能发现出错了。

我这样说大家是不是就好理解了?好,现在我们总结一下,检测d个错误,则编码系统码距>=d+1;纠正d个错误,则编码系统码距>2d。

海明码是一种多重奇偶检错码,具有检错和纠错的功能。海明码的全部码字由原来的信息和附加的奇偶校验位组成。奇偶校验位和信息位赋值在传输码字的特定位置上。这种组合编码方式能找出发生错误的位置,无论是原有信息位,还是附加校验位。

我们设海明码校验位为k,信息位为m,则它们之间的关系应用满足m+k+1<=(2的k次方)。

下面我们就正式开始了,我们以发送端发送原始信息101101为例,讲解海明码推导与校验过程。

1。确定海明码校验位长。m是信息位长,101101的m=6。根据m+k+1<=(2的k次方),解不等式得到最小k为4,即校验位为4,信息位加校验的总长度为10位。

2。推导海明码开始。那我们究竟要发送什么样的编码才可以呢,海明码校验位通常被从左至右安排在1(2的0次方)、2(2的1次方)、4(2的2次方)、8(2的3次方)、......的位置上。原始信息则从左至右填入剩下的位置。P1、P2等为检验位编号,B1、B2等为位置编号,如下,看下图时注意上下对齐:

P1   P2    1    P3     0     1     1     P4     0     1

B1   B2   B3   B4    B5   B6   B7   B8   B9   B10

校验位处于B1、B2、B4、B8位,剩下位为信息位,信息位依从左至右的顺序先行填写完毕。

3。计算校验位。把除去1、2、4、8(校验位位置值编号)之外的3、5、6、7、9、10值转换为二进制位,如下:

信息位B3     信息位编号的十进制为3     信息位编号的二进制为0011

信息位B5     信息位编号的十进制为5     信息位编号的二进制为0101

信息位B6     信息位编号的十进制为6     信息位编号的二进制为0110

信息位B7     信息位编号的十进制为7     信息位编号的二进制为0111

信息位B9     信息位编号的十进制为9     信息位编号的二进制为1001

信息位B10   信息位编号的十进制为10   信息位编号的二进制为1010

先把满足条件二进制位最低位(右边第1位)为1的所有Bi进行异或(xor)操作,结果填入P1。然后是右边第2位为1所有进行操作填入P2,依此类推。

依据上述方法得到校验位:

P1=B3 xor B5 xor B7 xor B9=1 xor 0 xor 1 xor 0=0

P2=B3 xor B6 xor B7 xor B10=1 xor 1 xor 1 xor 1=0

P3=B5 xor B6 xor B7=0 xor 1 xor 1 =0

P4=B9 xor B10=0 xor 1 =1

全部填入后得到如下:

 0     0     1      0      0      1     1      1     0      1

B1   B2   B3   B4    B5   B6   B7   B8   B9   B10

好了,到这里为止,信息的校验位加好了,发送端就准备要把这个加了校验位的信息发送出去了。当程序执行到发送命令后,这条信息就发送出去了,飞往目的端了。

4。校验。现在目的端收到这条信息了,想看看信息有没有错误,那就要执行校验程序,看看有没有问题,那怎么做呢,我们继续往下看。

将所有信息位位置编号1-10的值转换为二进制位

信息位B1     信息位编号的十进制为1     信息位编号的二进制为0001

信息位B2     信息位编号的十进制为2     信息位编号的二进制为0010

信息位B3     信息位编号的十进制为3     信息位编号的二进制为0011

信息位B4     信息位编号的十进制为4     信息位编号的二进制为0100

信息位B5     信息位编号的十进制为5     信息位编号的二进制为0101

信息位B6     信息位编号的十进制为6     信息位编号的二进制为0110

信息位B7     信息位编号的十进制为7     信息位编号的二进制为0111

信息位B8     信息位编号的十进制为8     信息位编号的二进制为1000

信息位B9     信息位编号的十进制为9     信息位编号的二进制为1001

信息位B10   信息位编号的十进制为10   信息位编号的二进制为1010

然后进行如下操作:

将所有信息编号的二进制的右边第1位为1的Bi进行异或操作,得到X1。将所有信息编号的二进制的右边第2位为1的Bi进行异或操作,得到X2。将所有信息编号的二进制的右边第3位为1的Bi进行异或操作,得到X4。将所有信息编号的二进制的右边第4位为1的Bi进行异或操作,得到X8。

上述过程对应公式描述如下:

X1=B1 xor B3 xor B5 xor B7 xor B9

X2=B2 xor B3 xor B6 xor B7 xor B10

X4=B4 xor B5 xor B6 xor B7

X8=B8 xor B9 xor B10

计算后得到一个形式为X8X4X2X1的二进制,转换为十进制时,结果为0,则未发生比特差错;结果为非0(假设为a),则错误发生在第a位。

好,现在我们把全过程模拟一遍,

假设起始端发送加了上述校验码的信息(原始信息为101101,加上校验码后为0010011101),目的端收到的信息为0010111101(看到没有,目的端收到了错误的信息,从左到右第5位发生的变化,这一位与原信息不同了),如下:

 0     0     1      0       1     1     1      1     0      1

B1   B2   B3   B4    B5   B6   B7   B8   B9   B10

依据公式为:

X1=B1 xor B3 xor B5 xor B7 xor B9=0 xor 1 xor 1 xor 1 xor 0=1 

X2=B2 xor B3 xor B6 xor B7 xor B10=0 xor 1 xor 1 xor 1 xor 1=0

X4=B4 xor B5 xor B6 xor B7=0 xor 1 xor 1  xor 1=1

X8=B8 xor B9 xor B10=1 xor 0 xor 1=0

则将X8X4X2X1=0101的二进制转换为5。结果非0,则错误发生在第5位。

到这里就全部结束了,大家应该听懂了吧,写这么长不容易,请大家给个好评吧。


作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows程序员必须掌握的计算机编码问题——海明码(通俗易懂) 的相关文章

  • Windows EventLog:它的操作速度有多快?

    我有一个服务应用程序 它通过 TCP 处理客户端请求并将任何事件写入 Windows EventLog 由于该应用程序预计会在短时间内为许多客户端和每个客户端的大量请求提供服务 假设每秒 1 到 50 个请求 因此我很想知道密集程度 CPU
  • 使用 git 客户端和 SVN 存储库的最佳工具/方法

    我已经使用 SVN 大约两年了 主要是通过 TortoiseSVN 和 IntelliJ 并尝试了 git 主要是通过 TortoiseGIT 在这里检测到模式 我们公司正在使用 SVN 作为存储库 他们不会考虑很快进行切换 在本地使用 g
  • Windows 7 和 Windows 8(桌面/Metro)中的 Internet Explorer 10 有何不同?

    Windows 7 和 Windows 8 上的 IE10 桌面模式和 或 Metro 模式 有什么区别 像 渲染差异 包括硬件加速 DX 过滤器和媒体查询 JS 差异 例如触摸事件 窗口大小调整 插件差异 它们对 Flash 的沙箱处理方
  • 如何在 Firebase 实时数据库上安排通知?

    我正在为我工 作的公司开发一个 flutter 通信应用程序 但我遇到了两个问题 这是我需要做的 1 向用户组或特定用户发送通知 并将这些通知保存在数据库或json文件中 该列表将作为 最新新闻 出现在我的应用程序的主屏幕上 问题是 当应用
  • 设置 eclipse 进行 Windows 驱动程序开发

    我正在尝试使用 WDK 7 1 0 编写用户模式 Windows XP Vista 和 7 虚拟打印机驱动程序 我打算使用 eclipse IDE 进行开发 所以想知道是否可以进行相同的设置 我希望做以下事情 1 Eclipse 能够识别
  • 从 IPConfig 获取 IP 地址,稍后在代码中使用,或保存 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 是否可以运
  • 适用于 Windows 的免费内存调试器? [复制]

    这个问题在这里已经有答案了 可能的重复 有 Windows 的良好 Valgrind 替代品吗 https stackoverflow com questions 413477 is there a good valgrind substi
  • Windows批量编程中读取文件名

    我想在Windows批处理编程中读取文件的名称 我尝试使用不同的方法但失败了请帮助 下面给出了场景 我的文件夹中有不同的文件 但所有文件的文件名长度相同 例如 1000342578 30062011 PDF 1000342329 30062
  • 批处理文件中的 %* 是什么意思?

    我见过的用法 在批处理文件和命令行中 有人可以解释一下的典型用法吗 有一个例子吗 它的意思是 命令行中的所有参数 例如 当您想要将命令行从批处理文件转发到另一个程序时 它非常有用 REM mybatchfile cmd echo You c
  • Emacs 23.1.50.1 在 Windows XP 上随机挂起 6-8 秒

    我的 Windows XP 机器上有 EmacsW32 23 1 50 1 emacs 运行 它随机挂起 5 到 8 秒 非常令人沮丧 有人有解决办法吗 我什至尝试使用来自 gnu ftp 站点的 emacs win32 二进制文件 23
  • 自动化 Windows UI 测试方法

    我们正在寻求设置自动化 UI 测试 并想知道最好的方法是什么 潜在的陷阱是什么 设置费用是否昂贵 提前致谢 B 自动化测试最大的消耗可能是时间 有很多非常昂贵的工具 但也有免费的工具 即使是昂贵的工具的成本也不太可能与正确设置自动化测试所需
  • 在 Windows 上使用 Python 打开设备句柄

    我正在尝试使用 Giveio sys 驱动程序 该驱动程序需要先打开一个 文件 然后才能访问受保护的内存 我正在查看 WinAVR AVRdude 中的 C 示例 它使用以下语法 define DRIVERNAME giveio HANDL
  • 安装 confluence-kafka 时“文件名或扩展名太长”?

    我在使用 pip install confluence kafka 安装 confluence kafka 时遇到一些问题 但我收到此错误 文件名或扩展名太长 详细信息如下 Collecting confluent kafka Using
  • 轻量级 Windows 应用程序的最佳开源示例是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Intellij IDEA 中为 Apache Tomcat 指定自定义 JRE 路径?

    问题是如何指定自定义JRE路径为Apache tomcat in Intellij IDEA 当从以下位置启动应用程序时IDEA 看来 只需配置它的路径 路径jvm dll in Apache Tomcat监视器没有帮助 还有其他想法或方法
  • C# 同步进程启动

    我正在尝试从一段代码启动一个进程 但我希望代码暂停执行 直到进程完成并退出 目前 我正在使用 System Diagnostics Process Start 类来启动 特别是 卸载程序 并且之后执行的代码确实依赖于安装程序卸载程序在恢复执
  • 如何在 Windows 中使用 cmake 更轻松地链接 gtk 库?

    我现在通过手动包含所有必需的路径 gtk包位于D Tools gtk bundle 2 20 0 20100406 win32 include directories D Tools gtk bundle 2 20 0 20100406 w
  • 读取进程的进程内存不会返回所有内容

    我正在尝试扫描第三方应用程序的内存 我已经查到地址了 现在是在0x0643FB78 问题是 从那以后我就再也爬不上去LPMODULEENTRY32 gt modBaseAddr is 0x00400000 and LPMODULEENTRY
  • 如何在 Windows 上的 PostgreSQL 中创建具有 UTF-8 排序规则的数据库?

    我正在为 Windows 上的 Bitbucket 服务器配置 PostgreSQL 数据库 在官方guide https confluence atlassian com bitbucketserver connecting bitbuc
  • 更改Word文档中的文本字体颜色

    我写了一个小测试词插件 但找不到方法改变字体颜色一句话 这是我的代码 var wordsList this Application ActiveDocument Words wordsList i Font TextColor WdColo

随机推荐

  • Python 和 A-frame实现从图像创建 3D 模型--附完整示例代码

    介绍 虚拟现实是指由计算机生成的模拟 允许用户使用特殊耳机进行交互 简而言之 它是由计算机创建的另类现实 而耳机可以让人们沉浸在该现实中 根据 Allied Market Research 的数据 到 2026 年 VR 内容创作市场将达到
  • 基于若依框架的微信小程序登录

    一 用户表结构 CREATE TABLE bus user user id varchar 32 COLLATE utf8mb4 bin NOT NULL COMMENT 用户id parent id varchar 32 CHARACTE
  • 秋招提前批已来,万字长文教你如何增加面试大厂的成功率

    本文是笔者在春季在 前端早早聊 手动笔芯 的面试专场分享的文字稿 主要针对前端社招 校招和实习的同学仅供参考 感兴趣的同学可以点击链接查看PPT和录屏 前端如何提高面试大厂的通过率 字节跳动秋季招聘提前批已经启动 欢迎投递幸福里业务线 内推
  • 嵌入式 ARM 汇编编程例题

    文章目录 用汇编语言实现 128 位数的减法 已知 32 位变量 X Y 存放在存储器的地址 0x90010 0x90014 中 要求实现 Z X Y 其中 Z 的值存放在 0x90018 中 已知 32 位有符号数 X 存放在存储器的地址
  • python request第三方库介绍

    python request第三方库介绍 快速上手 迫不及待了吗 本页内容为如何入门Requests提供了很好的指引 其假设你已经安装了Requests 如果还没有 去 安装 一节看看吧 首先 确认一下 Requests 已安装 Reque
  • mybatis查询mysql时间格式化 DATE_FORMAT

    在数据库中对应的是DateTime 查询参数为String类型 缺少时分秒的情况下使用 select from order where isDelete 0
  • 笔记 —— ByteArrayOutputStream

    内存输出流 ByteArrayOutputStream 此类实现了一个输出流 其中的数据被写入一个 byte 数组 缓冲区会随着数据的不断写入而自动增长 可使用 toByteArray 和 toString 获取数据 两个构造函数 1 By
  • Linux系统编程makefile制作动态库和静态库

    目录 制作动态库 制作静态库 首先准备简单的add c sub c main c head h 具体代码如下 head h文件 int Add int a int b int Sub int a int b add c文件 include
  • 山洪灾害监测预警系统解决方案

    一 方案概述 山洪灾害是指山丘地区由降雨引起的洪水 泥石流和滑坡灾害 近年来 我国突发性 局部性极端强降雨引发的山洪灾害导致大量人员伤亡 占洪涝灾害死亡总人数的比例趋上升趋势 群死群伤事件时有发生 山洪灾害严重制约山区和丘陵地区经济发展 人
  • SVM支持向量机学习——使用MATLAB实现基于SVM的数据二分类

    SVM支持向量机学习 使用MATLAB实现基于SVM的数据二分类 支持向量机 Support Vector Machine SVM 是一种广泛应用于分类 回归和异常检测等领域的算法 它的优点在于具有较高的准确性 鲁棒性和可扩展性 在本文中
  • Hyper-v 虚拟机挂载物理硬盘的方法-Windows Server 2022/2025

    起因 之前我写过一篇介绍在KVM虚拟机体系下 如何直接挂载物理硬盘和物理分区的方法 KVM虚拟机直接挂栽物理硬盘分区的方法 给libvirt虚机挂载磁盘 lggirls的博客 CSDN博客 近期帮助一个朋友搭建局域网 其中有OA系统要用到w
  • Get to know yosys & yosys-abc

    In this blog I m going to give some instructions about yosys yosys abc in Linux Environment yosys 0 7 gcc 5 4 0 ubuntu 1
  • verilog 基本语法 {}大括号的使用

    的基本使用是两个 一个是拼接 一个是复制 下面列举了几种常见用法 基本用法 表示拼接 第一位 第二位 表示复制 4 a 等同于 a a a a 所以 13 1 b1 就表示将13个1拼接起来 即13 b1111111111111 拼接语法详
  • 学习总结——按下按键灯亮,再次按下按键,灯灭

    按键控制灯的亮灭 1 主要实现按键控制灯的亮灭 按键按下 灯亮 再次按下 灯灭 主要对实现的逻辑进行控制 逻辑清晰 很简单 实现的方法有两种 方法1 将按键按下的值赋值给一个变量 变量除以2的值的是基数或者偶数来确定灯亮还是灯灭 程序中设置
  • 堆栈 对比

    https www cnblogs com guoxiaoyan p 8664150 html
  • STL — Set/Multiset容器

    1 1 Set容器基本概念 Set的特性是 所有元素都会根据元素的键值自动被排序 Set的元素不像map那样可以同时拥有实值和键值 set的元素即是键值又是实值 set不允许两个元素有相同的键值 我们可以通过set的迭代器改变set元素的值
  • POI解析word\pdf中表格

  • Windows10下SlowFast环境安装和运行

    SlowFast安装详解 第一步 下载官方源码 第二步 我搭建的环境配置 第二步 安装其他包以及出现的问题 第三步 构建SlowFast 第四部 下载权重和标签 第五步 更改参数 第六步 当然是运行啦 第一步 下载官方源码 github代码
  • Retrofit2.0使用详解

    简介 Retrofit是由Square公司提供的开源产品 为Android平台的应用提供一个类型安全的REST客户端 其实质上是对OkHttp的封装 使用面向接口的方式进行网络请求 利用动态生成的代理类封装了网络接口请求的底层 将REST
  • Windows程序员必须掌握的计算机编码问题——海明码(通俗易懂)

    我是荔园微风 作为一名在IT界整整25年的老兵 今天总结一下计算机中的编码问题 来看第二部分 海明码 很多初学者一看到海明码就郁闷 因为课本上关于海明码的描述实在是太难懂了 那就跟随我一起来搞懂海明码 我用最简单最好懂的方式描述 我不会使用