为什么我们使用base 32或base 64来表示数据而不是0和1?

0 java binary base64 serialization base

我最近编写了一个程序来序列化一些数据(java对象)并将结果字符串保存在文本文件中.信息在base 64中序列化,因此数据最终看起来像这样:

rO0ABXBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBzcgAab3JnLmJ1a2tpdC51dGlsLmlvLldyYXBwZXLyUEfs8RJvBQIA.

我有点理解base 64的意思,但是,因为这是胡言乱语,为什么文本文件或计算机从一开始就显示0和1?如果我正确理解了基础过程,那么计算机上的所有信息都会以0和1的形式存储在某处,因为这是计算机最终存储信息的唯一方式.base 64不仅仅是一种读取和解释字节的方法吗?为什么要让我的文本编辑器读取保存在计算机上的字节,将它们转换为字母(最终使文档更短)然后在上面的表单中显示它?尽管base 64导致在视觉上更紧凑地显示信息的方式,但是无论如何也没有人能够读取基本64文本并且文件仍然具有相同的确切大小.

Mar*_*c B 5

Base64用于通过不理解和/或破坏8位数据的系统发送8位数据.例如,大多数旧的电子邮件系统都假定7位文本,并且会丢弃您的8位电子邮件.

b64/b32不是存储格式.他们大量浪费了空间.将值编码到base64中将使其大小平均增加约33%.它们是TRANSMISSION格式,以确保您的8位数据完整地通过7位系统.

考虑一个简单的文本序列:abc.假设是ASCII文本,那就是

0x61      0x62       0x63      (hex)
01100001  01100010   01100011  (binary)
97        98         99        (decimal)
Run Code Online (Sandbox Code Playgroud)

当卡在一起成为一个文件时,你的位将是简单的

011000010110001001100011
Run Code Online (Sandbox Code Playgroud)

如果这个8比特字节的序列通过一个愚蠢的7比特传输介质发送,然后重新设置到8比特系统,则所有比特属于哪个字节的感知将丢失.你最终会

0110000   1011000  1001100  011
Run Code Online (Sandbox Code Playgroud)

因为接收8bit系统不知道原始数据是8bit.它将看到来自7位系统的位,并将这些位分成7位序列.现在你的价值被哄骗了:

0110000   1011000  1001100  011                   (binary)
48        88       88       corrupt/missing bits  (decimal)
30        58       58       corrupt/missing bits  (hex)
Run Code Online (Sandbox Code Playgroud)

这些值对应于ASCII字符

RS X X 
Run Code Online (Sandbox Code Playgroud)

并且与原始文本完全不同.