zoukankan      html  css  js  c++  java
  • 各种计算机编码与base64

    什么是base64,base64与Hex编码,ASCII编码,UTF-8编码都是什么关系

    1 计算机开始之初,二进制

    计算机所用的语言是什么呢?这个语言非常简单,只有0和1两种表示。0代表否,1代表是。通过0和1的各种组合,以及0和1之间的各种运算(位运算),计算机就能进行理解、分析这个世界,并帮助人类完成工作了。

    但是0和1太简单了,简单到任何一个简单的数字都可能用一长串0和1来表示。举了例子,如果让计算机记住1000这个数,计算机就要记住11,1110,1000这么长一串数字。计算机倒是好记,但是人类记不住啊… 有没有一种方法,能够让计算机表示的数据短一点,好记一点呢?

    2 Hex编码:缩短书写,变得稍微可接受

    Hex就是最简单的方法了。人类习惯于使用十进制,毕竟人类有是个手指,十个一进位,挺好的!计算机本质上是二进制,就0和1两种数字的表示方法,所有其他可以直接转换的表示方法中,进制只能有2这个数,不能有其他的数字。比如4,8,16就没问题。其他的数字,不管怎么折腾,转换后也得是2^n形式。

    想让人类和计算机都能接受表示形式,8进制和16进制都是可以接受的。8进制的话,只使用0-7折8个数字就好了。16进制,光用数字是不够了,还得用用其他的字符。然而,计算机毕竟是美国人发明的,他们觉得,干脆,就16进制:用0-9表示前10个数,后面的用A、B、C、D、E、F表示,不区分大小写。这就是最简单的Hex编码了。

    Hex的编码原理是:把一长串二进制数每4个分一组,如果位数不够就在高位补0。4位数字一共只有16种情况,分别用0-9,A-F表示这16种情况。
     
    3 ASCII码:要让可读性更强

    Hex编码虽然好,但有个问题:从计算机上打开个文件,满眼的十六进制数,很头大啊… 十六进制还是不太好表示文本。能不能创建一种方法,能表示键盘打出来的全部英文字符、符号呢?键盘打不出来的字符,比如什么回车啦,占位啦,用特殊的符号表示。这样一来,打开一个文件,满眼英文,岂不是很爽快…

    美国作为计算机的始祖国家,自然要推出一个这样的标准代码表。这就是美国信息交换标准代码,简称ASCII码表。这个码表包括了数字、英文大小写、符号、以及各种各样的转义字符,可以包含英文所用的全部功能。很快地,ASCII码称为了国际标准,现在大家知道的编码形式,都是与ASCII码兼容的。

    4 UTF-8:解决除英语之外其他语言

    这个码表一出来,英语国家开心了…其他国家的脑袋疼了… 带注音的符号怎么办?日语韩语怎么办?最为博大精深的中文怎么办… 于是,各个国家也推出了本国语言的编码表。但是,为了能在计算机系统中通用,这些编码表基本都与ASCII码兼容。

    最为知名的就是UTF-8了。这个编码又称为万国码,顾名思义,就是支持包括中文简体、中文繁体、日语、韩语等各种语言的编码。这玩意太复杂了… 我就不细说了。


    5 base64:多种编码沟通的桥梁

    既然每个国家都有自己的编码表了,问题也就来了。现在都国际化了,我要用一个支持本国语言的编码系统,打开另一个编码系统编码的文本,会出现什么情况呢?这就是乱码了… 更为严重的是,随着互联网的出现,各个国家的电脑都需要通信,而通信的一种方式就是使用URL地址。每个国家都希望把这个地址写成自己国家的语言。但这会导致其他国家根本没法访问地址,因为打不出这个字符嘛。所以,人类迫切需要一种中间编码形式,既能够兼容ASCII码,又能够把任意一种编码形式转换成只使用可读字符就能表示的编码。其中一种编码形式,就是Base64编码。

    Base64编码,顾名思义,用64个可读字符进行编码。与Hex的16个字符相比多了很多,但是比ASCII码又少了一倍,去除了不可读字符。标准Base64编码中,这些字符是:
    • 数字:0,1,2,3,4,5,6,7,8,9,共10个
    • 小写字母:a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,共26个
    • 大写字母:A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,共26个
    • 加好+以及斜杠/
    这种编码形式长度也短,效率也高。这样一来,数据通信的时候,不管来的是什么语言,都转化成Base64后再发送和接收。要是别国地址什么的打不出来,就直接打Base64编码形式就好了。
     
     
    base64算法与各种编码交互:比如 0100111100101010100011 这串二进制,在UTF-8里表示的是 “我是谁”。如果你想把“我是谁”转化成BASE64,你就要先把“我是谁”转化成“0100111100101010100011” 这串二进制(在UTF-8码表里找映射),然后再把这串二进制转化成 “ZG0abd12" 的BASE64 编码。具体这串二进制怎么转化成base64编码的请看base64算法。
    base64算法:base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。这样说会不会太抽象了?不怕,我们来看一个例子:

      转换前 aaaaaabb ccccdddd eeffffff 
      转换后 00aaaaaa 00bbcccc 00ddddee 00ffffff

    然后转换后的二进制对应base64码表上面64个字符,进行替换就产生base64码。

    base64特点:1、速度非常快。3、长短也短。3、能够将字符串A转换成字符串B,而且如果你光看字符串B,是绝对猜不出字符串A的内容来的。
    base64误区:这种编码形式长度也短,效率也高。这样一来,数据通信的时候,不管来的是什么语言,都转化成Base64后再发送和接收。要是别国地址什么的打不出来,就直接打Base64编码形式就好了。
     
    本文参考知乎问答https://www.zhihu.com/question/38036594
     
  • 相关阅读:
    [考试反思]0421省选模拟76:学傻
    [考试反思]0420省选模拟75:安在
    [考试反思]0418省选模拟74:杂枝
    [考试反思]0417省选模拟73:纠结
    [考试反思]0416省选模拟72:停滞
    [考试反思]0415省选模拟71:限制
    [考试反思]0414省选模拟70:阻塞
    [考试反思]0413省选模拟69:遗弃
    [考试反思]0411省选模拟68:毒瘤
    [考试反思]0410省选模拟67:迷惑
  • 原文地址:https://www.cnblogs.com/gauze/p/7719994.html
Copyright © 2011-2022 走看看