在计算机运行过程中,由于种种原因致使数据在存储过程中可能出现差错。为了能及时发现错误并及时纠正错误,通常使用一些编码方式。
奇偶校验是一种添加一个奇偶位用来指示之前的数据中包含有奇数还是偶数个1的检验方式。
对于一个二进制数:\(b_nb_{n-1}...b_2b_1\),添加一个校验位s,采取偶校验,即校验位使新数据中的1的个数为偶数。
新数据:\(b_nb_{n-1}...b_2b_1s\)。
即 \(b_n \oplus b_{n-1} \oplus ... \oplus b_2 \oplus b_1 \oplus s = 0\),则\(s = b_n \oplus b_{n-1} \oplus ... \oplus b_2 \oplus b_1\)。
在传输过程中,如果只有1位(奇数个位)发生了改变(包括校验位),那么将可以检测出来错误。但是如果有偶数个位发生了改变,那么校验位将是正确的,因此不能检测错误。而且,即使出现了错误,也不知道是哪一位出现了错误,数据必须整体丢弃并且重新传输。
汉明码的实质上是多重奇偶校验,通过巧妙的分组,实现了校验并纠正一位错误的能力。
任何一种编码是否具有检测能力和纠错能力,都与编码的最小距离有关。所谓编码最小距离,是指在一种编码系统中,任意两组合法代码之间的最少二进制位数的差异。
根据纠错理论得:
$ L -1 = D + C \ 且 \ (D \ge C)$
即编码最小距离L越大,则其检测错误的位数D越大,纠正错误的位数C也越大,且纠错能力恒小于或等于检错能力。
所以,如果我们在信息编码中增加若干位检测位,增大L,显然便能提高检错和纠错能力。汉明码就是根据这一理论提出的具有一位纠错能力的编码。
假设我们的一种编码系统是所有的3位二进制数,即\(设集合 S =\left\{ 000,001,010,011,100,101,110,111 \right\}\)。
那么对于任何一个数据,比如我们传输\(010\)这个数据,它发生错误会改变为:
显然,这三种数据都在集合当中,我们检验不出错误。
此时就是,\(L = 1\), 那么\(0 = D + C\)。
\(设集合 S =\left\{ 001,010,100 \right\}\)。
可以看出,我们的编码最小距离为2,\(L = 2\),那么\(1 = D+C\),那么\(D = 1, C = 0\)。即,可以检一位错,不能纠错。
比如,我们传输数据\(010\):
但是,\(110,000,011\)均不在集合S中,所以我们可以判断这是出错了,那怎么纠错呢?
对于出错数据\(110\),它的可能正确数据:
所以是会有两种情况,故,无法纠错。
\(设集合 S =\left\{ 000,111 \right\}\)。
则,\(L = 3, D = 1 \;且 \;C= 1 \;或\; D = 2\;且\; C = 0\)。
设欲检测的二进制代码为n位,为使其具有纠错能力,需增添k位检测位,组成 n + k 位的代码。为了能准确对错误定位以及指出代码没错,新增添的检测位数 k应满足:
\(2^k \ge n + k + 1\)
变换一下:
$2^k - 1\ge n + k $
k位检测位可以提供\(2^k\)种状态,减去一种正确的状态,即,所有错误的状态应该包括分别每一位出错的情况,这里每一位出错包括检测位,所以就是\(n + k\)。
这样是不是更好理解。
由此求出不同代码长度 n,所需检测位的位数 k:
| n | K(最小) |
|---|---|
| 1 | 2 |
| 2~4 | 3 |
| 5~11 | 4 |
| 12~26 | 5 |
| 27~57 | 6 |
| 58~120 | 7 |
k的位数确定后,便可由它们所承担的检测任务设定它们在传送代码中的位置及它们的取值。
设\(n + k\)位代码自左至右依次编为第\(1,2,3,···,n + k\),而将\(k\)位检测位记作\(C_i(i = 1,2,4,8,···)\),分别安插在\(n + k\)位代码编号的第\(1,2,4,8,···,2^{k-1}位上\)。
这种小组的划分有以下特点:
特点似乎有点不明所以,总结起来就是:
稍后,我们会明白这样设计的缘由。
现在我们需要传递一个4位二进制数,记为\(b_4b_3b_2b_1\)。
那么根据前面的核心公式 \(2^k \ge n + k + 1\),可以求出最小的 k为3。
| 二进制序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| 名称 | \(C_1\) | \(C_2\) | \(b_4\) | \(C_4\) | \(b_3\) | \(b_2\) | \(b_1\) |
则,根据配偶原则:
\(C_1 \oplus b_4 \oplus b_3 \oplus b_1 = 0\)
\(C_2 \oplus b_4 \oplus b_2 \oplus b_1 = 0\)
\(C_4 \oplus b_3 \oplus b_2 \oplus b_1 = 0\)
令\(b_4b_3b_2b_1 = 1101\),则:
\(C_1 = b_4 \oplus b_3 \oplus b_1 = 1 \oplus 1 \oplus 1= 1\)
\(C_2 = b_4 \oplus b_2 \oplus b_1 = 1 \oplus 0 \oplus 1 =0\)
\(C_4 = b_3 \oplus b_2 \oplus b_1 = 1 \oplus 0 \oplus 1 = 0\)
故 0101的汉明码应为\(C_1C_2b_4C_4b_3b_2b_1\),即1010101。
汉明码的纠错过程实际上就是对配偶原则(或者奇)的检验,根据新数据的状态,便可直接指出错误的位置。直接看例子:
已知,传送的正确汉明码是\(1010101\)(配偶原则),传送后接受到的汉明码为\(1010111\):
| 二进制序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| 发送的汉明码 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
| 接收的汉明码 | 1 | 0 | 1 | 0 | 1 | 1 | 1 |
检测:
可见,\(P_4 和 P_2\)都不为 0,显然出错了。
那如何找出错误呢?
这里是假设只出现一位错误,因为此时的\(L = 3\),只能检一位错,纠一位错。
此时,更加巧合的是:二进制数\(P_4P_2P_1 = 110\)恰好是\(6\)。
换句话说,检测出的信息所表示的数就是出错的位置。
我们用韦恩图来表示一下刚刚找错误位的过程:

刚刚找 6的过程不就是:\(\neg P_1 \cap P_2 \cap P_4\),这样十分巧妙地利用集合就找出了错误的位。
这样可以理解之前设计的原因了吧。
唐朔飞. 计算机组成原理[M]. 第3版. 高等教育出版社, 2020.
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
我已经在mountainlion上成功安装了rbenv和rubybuild。运行rbenvinstall1.9.3-p392结束于:校验和不匹配:ruby-1.9.3-p392.tar.gz(文件已损坏)预期f689a7b61379f83cbbed3c7077d83859,得到1cfc2ff433dbe80f8ff1a9dba2fd5636它正在下载的文件看起来没问题,如果我使用curl手动下载文件,我会得到同样不正确的校验和。有没有人遇到过这个?他们是如何解决的? 最佳答案 tl:博士;使用浏览器从http://ftp.rub
我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于
我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不
我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject
我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf
root@li417-132:~#rvmpkginstallzlibFetchingzlib-1.2.7.tar.gzto/usr/local/rvm/archivesThereisnochecksumfor'http://prdownloads.sourceforge.net/libpng/zlib-1.2.7.tar.gz'or'zlib-1.2.7.tar.gz',it'snotpossibletovalidateit.Ifyouwishtocontinuewithunverifieddownloadadd'--verify-downloads1'afterthecommand.
对于我正在编写的Rails3应用程序,我正在考虑从本地文件系统上的XML、YAML或JSON文件中读取一些配置数据。重点是:我应该把这些文件放在哪里?Rails应用程序中是否有用于存储此类内容的默认位置?附带说明一下,我的应用程序部署在Heroku上。 最佳答案 我经常做的是:如果文件是通用配置文件:我在目录/config中创建一个YAML文件,每个环境有一个上层key如果我为每个环境(大项目)创建一个文件:我为每个环境创建一个YAML并将它们存储在/config/environments/然后我在加载YAML的地方创建了一个初始化
有没有办法将RubyVM::InstructionSequence存储到文件中并稍后读取?我尝试了Marshal.dump但没有成功。我收到以下错误:`dump':no_dump_dataisdefinedforclassRubyVM::InstructionSequence(TypeError) 最佳答案 是的,有办法。首先,您需要使InstructionSequence的load方法可访问,默认情况下该方法是禁用的:require'fiddle'classRubyVM::InstructionSequence#RetrieveR