二维码

3.3 编码/解码算法 - 数据结构 - 机器学习

1260 人阅读 | 时间:2021年01月15日 01:05
3.3 编码/解码算法 - 数据结构 - 机器学习 #daohang ul li t,.reed .riqi,a.shangg,a.xiatt,a.shangg:hover,a.xiatt:hover,a.shang,a.xiat,a.shang:hover,a.xiat:hover,.reed-pinglun-anniu,span.now-page,#daohangs-around,#caidan-tubiao,#daohangs,#daohangs li,#btnPost{background-color:#D10B04;} .dinglanyou1 h3{border-bottom:3px solid #D10B04;} #dibuer{border-top:2px solid #D10B04;}.cebianlan .rongqi h3{border-bottom:1px solid #D10B04;} #edtSearch{border:1px solid #D10B04;} #daohang .zuo ul li{border-right:1px solid #;} #daohang ul li t a{border-top:1px solid #;border-right:1px solid #D10B04;} #daohang ul li t a:hover{border-right:1px solid #;} #daohang .you ul li a:hover,#daohang .zuo ul li a:hover,.reed-pinglun-anniu:hover{background-color:#;} a:hover,.reed h6 a:hover,#dibuer a:hover,.reed .riqiding,.cebianlan .rongqi li a:hover,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.shu a,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.huifuliuyan a:hover,.reed-biaoti h6 span{color:#D10B04;} .reed .kan a{color:#0A0AF5;}.reed .kan a:hover{color:#D10101;} @media screen and (max-width:1492px){a.shang,a.xiat{background:none;} a.xiat:hover,a.shang:hover{background-color:#f9f9f9;background-image:none;text-decoration:none;}} var _hmt = _hmt || [];(function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s);})(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?2d748c9763cfc72fb7d1ccab29f0770d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?f6d451f3f1be23f3abf240c64c469c1b"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();

当前位置:首页 » 区块链精品文章 » 正文

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646201", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646162", container: s }); })();

3.3 编码/解码算法

1229 人参与  2018年08月25日 18:00  分类 : 区块链精品文章  评论

众所周知,计算机存储和处理的都是二进制数据。为了简洁,实际上使用最多的是二进制的一个变种——十六进制。比如笔者 的名字叫嘉文,中文拼音是jiawen(全小写),在计算机里存储的就是6A696177656E。很明显,人类容易记住jiawen,而其相应的十六进 制代码6A696177656E就很考验人的记忆力了。同样,人类很难记住十六进制的数据,但如果是十六进制编码的文本字符串,就相对好记好读一些了。以 下是一张ASCII码表的一部分。


DEC  OCT  HEX    BIN         Symbol   HTML Number   HTML Name Description
0    000   00    00000000    NUL      �        Null char
1    001   01    00000001    SOH              Start of Heading
2    002   02    00000010    STX              Start of Text
3    003   03    00000011    ETX              End of Text
4    004   04    00000100    EOT              End of Transmission
5    005   05    00000101    ENQ              Enquiry
6    006   06    00000110    ACK              Acknowledgment
7    007   07    00000111    BEL              Bell
8    010   08    00001000    BS               Back Space
9    011   09    00001001    HT       	        Horizontal Tab
10   012   0A    00001010    LF       
        Line Feed
11   013   0B    00001011    VT               Vertical Tab
...
47   057   2F    00101111    /        /         Slash or divide
48   060   30    00110000    0        0         Zero
49   061   31    00110001    1        1         One
50   062   32    00110010    2        2         Two
51   063   33    00110011    3        3         Three
52   064   34    00110100    4        4         Four
53   065   35    00110101    5        5         Five
54   066   36    00110110    6        6         Six
55   067   37    00110111    7        7         Seven
56   070   38    00111000    8        8         Eight
57   071   39    00111001    9        9         Nine
58   072   3A    00111010    :        :         Colon
...
70   106   46    01000110    F        F         Uppercase F
71   107   47    01000111    G        G         Uppercase G
72   110   48    01001000    H        H         Uppercase H
73   111   49    01001001    I        I         Uppercase I
74   112   4A    01001010    J        J         Uppercase J
75   113   4B    01001011    K        K         Uppercase K
76   114   4C    01001100    L        L         Uppercase L
77   115   4D    01001101    M        M         Uppercase M
78   116   4E    01001110    N        N         Uppercase N
79   117   4F    01001111    O        O         Uppercase O
80   120   50    01010000    P        P         Uppercase P
81   121   51    01010001    Q        Q         Uppercase Q
82   122   52    01010010    R        R         Uppercase R
www.ascii-code.com 6A696177656E


十六进制的07是一个Bell(响铃),如果试着用计算机程序去打印,结果是不可见,也不可理解的,只能听到一声 铃声。但是文本字符串"07"则相对容易理解和记忆。上文提到过,比特币地址都是十六进制的数,不做转换,打印的话毫无意义,人类无法直观地辨识。大家可 以想象一下查询自己的银行账户余额的场景:假如账户里只有77块钱了,查询结果打印的是大写字符M(十进制的编码是77)。我相信大部分用户都不知道那是 77的意思。相对的,如果把数字77转换成文本“77”(其十六进制编码是3737)后再打印,对于显示在屏幕上的文本77,用户就会理解了。总结一下:

3.3 编码/解码算法 - 数据结构 - 机器学习

下面的几节将讨论用文本来表示十六进制数据的几种编码方式。

3.3.1 Base64

这是一种用64个字符来表示任意二进制数据的方法,通常exe、jpg、pdf等文件都是二进制文件,用文本编辑器打开都是乱码,那么就需要一个方法,可以将二进制编码成字符串的格式,这样可以将二进制文件用文本打开查看。

那么,既然是Base64,就是通过64个字符来编码的,具体是哪64个字符呢?请见下表:

3.3 编码/解码算法 - 数据结构 - 机器学习

Base64编码主要用在传输、存储、表示二进制等领域,还可以用来加密。但是这种加密比较简单,只是一眼看上去不知道什么内容罢了,对应编码规则,可以很容易的解码,当然也可以对Base64的字符序列进行定制来进行加密,我们来看下Base64的编码过程。

首先,既然是使用上述64个字符的范围来表示的,那么要能够表示出64个字符的各种组合,得起码用6个bit才 行,根据排列组合,6个bit可以总共表示出26个组合的字符排列;针对一份需要转化的二进制文件,可以这样来处理,每3个字节一组,这样一共是 24bit,然后可以针对这个24bit再来划分,划分成每6bit一组,这样一共可以分成4组,则对照上表去查找对应的字符就可以了,这样就可以转换为 Base64了,简单吧。

那么,如果在3个字节一组划分的时候,如果不是3的倍数怎么办呢?这样就需要使用\x00字节在末尾补足,再在编码的末尾加上1个或2个=号,表示补了多少字节。

由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以又有一种url safe的Base64编码,其实就是把字符+和/分别变成-和_。

根据这个原理,其实还是比较容易理解这种编码思想的,而且也可以看出,这种编码是可以逆向的,以"yes"这个字符串为例,它的Base64编码是eWVz,大家可以自行尝试几个例子。

3.3.2 Base58

顾名思义,Base58是基于58个字母和数字组成的,有了Base64的基础,我们就比较容易理解Base58了,实际上就是Base64的一个子集,相对于Base64来说,Base58不包括以下Base64的字符:

·数字0

·大写字母O

·大写字母I

·小写字母l

·+与/

可以看出,小写o和大写O很容易和数字0混淆,小写l和大写I很容易和数字1混淆,Base58就是Base64去除了几个看起来容易混淆的字符,以及容易导致转义的/和+。Base58的编码表如下:

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

必须注意,不同的应用实现使用的编码表内容是一样的,但是顺序可能不一样,比如:

1)比特币地址:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz;

2)Ripple地址:rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz。

接下来我们来了解一下Base58Check,比特币使用的是改进版的Base58算法,是为了解决Base58编码的字符串没有完整性校验机制。在传播过程中,如果出现某些字符损坏或者遗漏,就没法检测出来了,所以使用了改进版的算法Base58Check。

3.3.3 Base58Check

在二进制数据的传输过程中,为了防止数据传输的错误,保护数据安全,通常会加一个校验码,通过校验码的配合可以发 现数据是否被破坏或者是否在发送时输入错误了。Base58Check就是Base58加上校验码,或者可以说是Base58的一种编码形式,在比特币系 统中生成钱包地址的时候就使用到了这种编码形式。我们知道,钱包地址是用来转账的,虽然Base58编码已经可以做到避免一些容易混淆的字符,但是还不能 保证用户的误输入或者地址信息在传输过程中由于某种原因被损坏,这会给用户带来潜在的损失风险。

Base58Check的编码方式,在我们第1章中介绍比特币地址的时候已经提到过,它的编码方式是这样的:进行 编码前,在待编码的内容字符串中加入一个字节的版本信息,版本信息可以自行约定,比如比特币地址采用了0x00作为版本信息,然后再加入待编码内容字符串 的哈希值,通常只要取得哈希值中的4个字节就可以了,加到一起后,然后再整体进行Base58编码。比特币地址的生成过程中,是将版本字节放在了头部,而 将4个字节的哈希值放在了尾部,然后进行编码生成。这个原理还是很简单的,哈希算法具有先天的数据完整性检测能力,在这里我们又看到了哈希算法的又一个应 用。

经过整体编码后的数据在传输过程中如果有发生损坏或者篡改,接收方在得到数据后,会对原始数据进行同样的校验码计 算,并且和接收到的结果中的校验码进行比较。由于哈希算法的特点,只要原始数据有任何更改,计算出的哈希值都会发生变更,因此只要校验码不一致就说明数据 不是合法的。

来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=102

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdPic":"","bdStyle":"0","bdSize":"16"},"share":{},"image":{"viewList":["qzone","tsina","tqq","renren","weixin"],"viewText":"分享到:","viewSize":"16"},"selectShare":{"bdContainerClass":null,"bdSelectMiniList":["qzone","tsina","tqq","renren","weixin"]}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
区块链是什么  

微信号:qq444848023    QQ号:444848023

加入【我是码农】QQ群:864689844(加群验证:我是码农)

<< 上一篇 下一篇 >>
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646186", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646175", container: s }); })();
搜索

网站分类

标签列表

最近发表

    (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https'){ bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else{ bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();

全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试

var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1276413723'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s23.cnzz.com/z_stat.php%3Fid%3D1276413723%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));本站资源大部分来自互联网,版权归原作者所有!

jQuery(document).ready(function($){ /* prepend menu icon */ $('#daohangs-around').prepend('
'); /* toggle nav */ $("#caidan-tubiao").on("click", function(){ $("#daohangs").slideToggle(); $(this).toggleClass("active"); }); });

©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 0 人评论
搜索
作者介绍
30天热门
×
×
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×