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

当前位置:首页 » 区块链精品文章 » 正文
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.1 Base64
这是一种用64个字符来表示任意二进制数据的方法,通常exe、jpg、pdf等文件都是二进制文件,用文本编辑器打开都是乱码,那么就需要一个方法,可以将二进制编码成字符串的格式,这样可以将二进制文件用文本打开查看。
那么,既然是Base64,就是通过64个字符来编码的,具体是哪64个字符呢?请见下表:
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
微信号:qq444848023 QQ号:444848023
加入【我是码农】QQ群:864689844(加群验证:我是码农)
- 大家谈之《区块链大革命》2018-09-25 09:54
- 第5章 共识算法详解2018-09-30 14:50
- 第一章 区块链:信任的机器2018-09-25 15:24
- 二、程序设计理念的变化2018-09-25 15:00
网站分类
- 数据结构
- 数据结构视频教程
- 数据结构练习题
- 数据结构试卷
- 数据结构习题解析
- 数据结构电子书
- 数据结构精品文章
- 区块链
- 区块链精品文章
- 区块链电子书
- 大数据
- 大数据精品文章
- 大数据电子书
- 机器学习
- 机器学习精品文章
- 机器学习电子书
- 面试笔试
- 物联网/云计算
标签列表
- 数据结构 (39)
- 数据结构电子书 (20)
- 数据结构习题解析 (8)
- 数据结构试卷 (10)
- 区块链是什么 (261)
- 数据结构视频教程 (31)
- 大数据技术与应用 (12)
- 百面机器学习 (14)
- 机器学电子书 (29)
- 大数据电子书 (37)
- 程序员面试 (10)
- RFID (21)
最近发表
- 找出数组中有3个出现一次的数字
- 《百面机器学习》电子书下载
- 区块链精品电子书《深度探索区块链:Hyperledger技术与应用_区块链技术丛书》张增骏
- 区块链精品电子书《比特币:一个虚幻而真实的金融世界》
- 区块链精品电子书《图说区块链》-徐明星 & 田颖 & 李霁月
- 区块链精品电子书《是非区块链:技术、投机与泡沫》-英国《金融时报》
- 区块链精品电子书《商业区块链:开启加密经济新时代》-威廉·穆贾雅
- 区块链精品电子书《人工智能时代,一本书读懂区块链金融 (互联网_时代企业管理实战系列)》-马兆林
-
(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"));本站资源大部分来自互联网,版权归原作者所有!
评论专区