zoukankan      html  css  js  c++  java
  • Atitit.Base64编码原理与实现设计

    Atitit.Base64编码原理与实现设计

     

     

    1. Base64编码1

    1.1. 为什么要用自己的base64编码方案1

    2. Base64编码由来1

    3. Base64编码原理1

    3.1. 具体来说,转换方式可以分为四步:2

    3.2. 注意2

    3.3. Padding3

    4. URL安全的Base64编码3

     

    1. Base64编码

    1.1. 为什么要用自己的base64编码方案

    防止apache codec  jdkjar冲突。

     

    2. Base64编码由来

    Base64最早是用来解决电子邮件的传输问题。

    传统的电子邮件是1982年定下技术规范的,详见rfc0822。该规范的一个重要特点,就是规定电子邮件只能使用ASCII可打印字符。这就导致非英语字符或二进制文件(比如图片)不同通过电子邮件进行传输了。

    作者::  ★(attilax)>>>   绰号:老哇的爪子  全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊  汉字名:艾龙,  EMAIL:1466519819@qq.com

    转载请注明来源: http://www.cnblogs.com/attilax/

     

     

    3. Base64编码原理

    简单来说, Base64编码就是从ASCII码中选出64个字符----大写字母A-Z、小写字母a-z、数字0-9、符号"+""/"(再加上作为填充字符的"=",实际上是65个字符),作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符。

     

    3.1. 具体来说,转换方式可以分为四步:

    1. 将每三个字节分成一组,一共24个二进制位:3*8=24

    2. 将这24个二进制位分成4组,每组有6个二进制位:24/4=6

    3. 在每组前加两00,扩展成32个二进制位,即4个字节:4*(6+2)=32

    4. 

    根据下面的编码表,得到扩展后每个字节的对应符号,就是Base64的编码值

    5. 

    Value Encoding  Value Encoding  Value Encoding  Value Encoding

        0 A            17 R            34 i            51 z

        1 B            18 S            35 j            52 0

        2 C            19 T            36 k            53 1

        3 D            20 U            37 l            54 2

        4 E            21 V            38 m            55 3

        5 F            22 W            39 n            56 4

        6 G            23 X            40 o            57 5

        7 H            24 Y            41 p            58 6

        8 I            25 Z            42 q            59 7

        9 J            26 a            43 r            60 8

       10 K            27 b            44 s            61 9

       11 L            28 c            45 t            62 +

       12 M            29 d            46 u            63 /

       13 N            30 e            47 v

       14 O            31 f            48 w         (pad) =

       15 P            32 g            49 x

       16 Q            33 h            50 y

    6. 

     

    3.2. 注意

    1. 因为转换后的每个字符的最高两位都是0,所以实际有效位数是6位,也就是26=64个字符就可以覆盖所有的编码。

    2. 如果剩下的字符不足3个字节,则用0填充,输出字符使用"=",因此编码后输出的文本末尾可能会出现12"="

    3. 因为Base643个字节转化成4个字节,因此Base64编码后的文本,会比原文本大出三分之一左右。

     

    3.3. Padding

    Base64是三个字节(Bytes)作为一组(24-bit block)的编码转换,如果字节数不是三的倍数,那么就会出最后一组只有一个或者两个字节的情况,按下面的规则处理:

    1. 一个字节的情况:将这一个字节的8个二进制位,按照每组6个二进制位转成二组,最后一组除了前面加二个0以外,后面再加40。这样得到一个二位的Base64编码,再在末尾补上两个"="号。

    2. 二个字节的情况:将这二个字节的一共16个二进制位,按每组6个二进制位转成三组,最后一组除了前面加两个0以外,后面也要加两个0。这样得到一个三位的Base64编码,再在末尾补上一个"="号。

     

    参考base64架构图片

     

    4. URL安全的Base64编码

    由于‘+’,‘/’两个字符在URL中有特殊含义,将Base64编码后的数据在通过URL传输时需要通过URL编码进行转义,但是这样子会导致URL无意义的变长,而且多了一个URL编解码步骤。为了避免这个问题,出现了一种用于URL的改进Base64编码变种,它其实就是简单的把标准Base64中的'+''/'分别改成了'-''_'。对于填充字符'=',有些变种是把它直接去掉,有些则是把它替换成'.'

     

    Base64编码学习笔记 - 简书.html

  • 相关阅读:
    hihoCoder #1176 : 欧拉路·一 (简单)
    228 Summary Ranges 汇总区间
    227 Basic Calculator II 基本计算器II
    226 Invert Binary Tree 翻转二叉树
    225 Implement Stack using Queues 队列实现栈
    224 Basic Calculator 基本计算器
    223 Rectangle Area 矩形面积
    222 Count Complete Tree Nodes 完全二叉树的节点个数
    221 Maximal Square 最大正方形
    220 Contains Duplicate III 存在重复 III
  • 原文地址:https://www.cnblogs.com/attilax/p/5419214.html
Copyright © 2011-2022 走看看