zoukankan      html  css  js  c++  java
  • Base64

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
    Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
    Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本。
    中文名
    基于64个可打印字符来表示二进制数据
    外文名
    base64
    属    性
    编码方式
    应    用
    用于传输8Bit字节代码
    定    义
    8Bit字节代码的编码方式之一
    可用于
    在HTTP环境下传递较长的标识信息
    特    性
    Base64编码具有不可读性

    Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于 2的6次方是64,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。

    在MIME格式中,剩余两个字符是加号+和斜杠/,等号=用来作为后缀用途。

    UTF-7是一个修改版Base64,主要的区别在于不用等号=补余,因为该字符通常需要大量的转译。

    在IRCu等软件所使用的P10 IRC服务器间协议中,将+/改成了[]。

    Base64编码可用于在HTTP环境下传递,不在末尾填充=号,并将标准Base64中的+和/分别改成了-和_。

    base64的原理

    base64编码后的数据比原始数据略长,比原来长1/3。为什么会长1/3?我们学习下原理,之后工作中base64就再也不会挡道了。

    转换的时候,将3字节的数据,先后放入一个24位的缓冲区中,先来的字节占高位。数据不足3字节的话,于缓冲器中剩下的比特用0补足。每次取出6比特,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出,直到全部输入数据转换完成。若原数据长度不是3的倍数时且剩下1个输入数据,则在编码结果后加2个=;若剩下2个输入数据,则在编码结果后加1个=。

    换句话,本来3个字节,base64经过自己的编码成为4个字节。比原理多了1/3。

    来,举个例子

    文本helascii 编码104101108二进制011010000110010101101100base64 6位01101000 0110010101101100base64 10进制编号2662144base64 结果aGVs

    hel的base64编码结果就是aGVs

    base64码表

    base64的应用

    base64的应用特别广泛,个人在开发中遇到最多的两个方面,第一个是URL的base64,另一个是图片base64。

    先说第一种,已经有urlencode了,为什么还需要base64 的URL。各有用途。

    urlencode是将-_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。如果一个URL里面有+ 有空格,是不是urlencode就搞不定,使用base64就会迎刃而解。带来的代价就URL比原理长了1/3

    图片编码的问题,经常跟客户端开发的时候,客户端使用二进制流上传图片的时候比较复杂,就可以使用base64将图片的二进制编码转成base64,服务端接到数据之后再basedecode之后就是图片的二进制流。特别方便,带来的结果就是,传输的数据多了1/3。

    遇到的问题

    根据RFC 822规定,每76个字符,还需要加上一个回车换行。

    出问题的一般都是822规定,有的语言,对base64decode的时候,发现有换行符就decode失败了,究其原因基本都市822规定,有很多换行,decode的时候解码失败,知道原因了就特别简单,将换行符 | 替换成 空,再base64decode就可以了。

  • 相关阅读:
    FtpClient中文乱码问题解决
    JS点击按钮弹出窗口
    win7配置简单的FTP服务器
    docker 使用案例:部署nginx
    Asp.Net Boilerplate Project (ABP) 视频教程
    dva.js 用法总结
    webpack4: compilation.mainTemplate.applyPluginsWaterfall is not a function 解决方法
    c# MongoDB Driver 官方教程翻译
    c# redis 操作类库推荐:StackExchange.Redis.Extensions
    react-native导航器 react navigation 介绍
  • 原文地址:https://www.cnblogs.com/niuyaomin/p/11924486.html
Copyright © 2011-2022 走看看