我的编程空间,编程开发者的网络收藏夹
学习永远不晚

base64编码原理是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

base64编码原理是什么

这篇文章主要介绍“base64编码原理是什么”,在日常操作中,相信很多人在base64编码原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”base64编码原理是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    base64 由来

    base64 是网络传输 8Bit 字节代码的编码方式之一,是一种基于 64 个可打印字符来表示二进制数据的方法。在做支付系统时,报文交互都需要使用 base64 对明文进行转码,然后再进行签名或加密,之后再进行(或再次 base64 转码)传输。那么,base64 到底起到什么作用呢?

    在参数传输的过程中经常遇到的一种情况:使用全英文的字符串没问题,但一旦涉及到中文就会出现乱码的情况。与此类似,网络上传输的字符并不全是可打印的字符,比如二进制文件、图片等。base64 的出现就是为了解决此问题,它是基于 64 个可打印的字符来表示二进制的数据的一种方法。

    电子邮件刚问世的时候,只能传输英文,但后来随着用户的增加,中文、日韩俄文等文字的用户也有需求,但这些字符并不能被服务器或网关有效处理,因此 base64 就登场了。随后,base64 在 URL、Cookie、网页传输少量二进制文件中也有相应的使用。

    base64 的编码原理

    基于a-zA-Z0-9+/这 64 个字符来标识二进制数据,另外=符号用于当字节缺位时补用。

    base64 编码对照表

    base64 编码对照表

    索引

    对应字符

    索引

    对应字符

    索引

    对应字符

    索引

    对应字符

    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



    15

    P

    32

    g

    49

    x



    16

    Q

    33

    h

    50

    y



    base64 的编码转换规则

    base64 要求把每三个 8Bit 的字节转换四个 6Bit 的字节(3*8 = 4*6 = 24),然后把 6Bit再添两位高位 0,组成四个 8Bit 的字节(4*8=32)。

    为什么使用 3 个字节一组呢?因为 6 和 8 的最小公倍数为 24,三个字节正好 24 个二进制位,每 6 个 bit 位一组,恰好能够分为 4 组。

    同时用于分组后每组添加两个高位 0,转换后的字符串理论上将要比原来的字符长 1/3(24/32=1/3)

    • 步骤分解:

      将待转换的字符串每三个字符分为一组,每个字符字节占 8bit,那么共有 24 个二进制位。

      将 24 个二进制位每 6 个字节为一组,共分为 4 组。

      在每组 6 字节前面添加两个 0,每组由 6 字节变为 8 字节二进制位,组成总共 32 个二进制位,即四个字节。

      根据 base64 编码对照表获得对应的值。

    • 举个栗子

      LJY 对应的 ASCII 码值分别为 76、74、89,对应的二进制值是 01001100、01001010、01011001。由此组成一个 24 位的二进制位字符串。

      将 24 位的二进制位字符串,按照每 6 位二进制位一组分成 4 组。

      对 4 组 每组 6 位二进制位字符串前面补两个 0,每组扩展为 8 位二进制位,4 组共扩展成 32 个二进制位,此时 4 组二进制位分别为:00010011、00000100、00101001、00011001。其对应的 base64 编码索引为:19、4、41、25。

      用 base64 编码索引值在 base64 编码表中进行查找,分别对应:T、E、p、Z。

      • 因此LJYbase64 编码之后就变为:TEpZ。

      • 以标准 3 个字符LJY为例。

    |   文本           |    L     |    J     |    Y     ||  ASCII          |    76    |    74    |    89    || 二进制位         | 01001100 | 01001010 | 01011001 || 分组二进制       | 010011   | 000100   | 101001   | 011001   || 分组二进制补2个0 | 00010011 | 00000100 | 00101001 | 00011001 || 分组索引         |   19     |   4      |   41     |   25     || base64编码       |   T     |   E      |    p      |   Z      |主要展示:转换前二进制位: 01001100 01001010 01011001转换后二进制位: 00010011 00000100 00101001 00011001
    • 字符位数不足情况

    上述栗子是面向刚好三个字符为一组的情况。当然不是所有时候都这么巧字符位数足够,除此以外有位数不足的情况。那么,面对字符位数不足的情况下该如何处理呢?

    base64 给出的方案是,当每组字符不足三位时,不足位数位置需要使用=符号补上。

    位数不足情况处理情景:

    • 位数缺一个字节:一个字节共 8 个二进制位,依旧按照规则进行分组。此时共 8 个二进制位,每 6 个一组,则第二组缺少 4 位,用 0 补齐,得到两个 base64 编码,而后面两组没有对应数据,都用=补上。

    • 位数缺两个字节:两个字节共 16 个二进制位,依旧按照规则进行分组。此时总共 16 个二进制位,每 6 个一组,则第三组缺少 2 位,用 0 补齐,得到三个 base64 编码,第四组完全没有数据则用=补上。

    位数不足图解如下:

    <!-- 缺2位字符,字符串以A为例转换base64后位QQ== -->|   文本(1Byte)  |    A     |          |          || 二进制位         | 01000001 |          |          || 分组二进制       | 010000   | 010000   |          |          || 分组二进制补0    | 00010000 | 00010000 |          |          || 分组索引         |   16     |   16     |          |          || base64编码       |   Q     |   Q      |    =      |   =      |<!-- 缺1位字符,字符串以AB为例转换base64后位QUI= -->|   文本(1Byte)  |    A     |     B    |          || 二进制位         | 01000001 | 01000010 |          || 分组二进制       | 010000   | 010100   |  001000  |          || 分组二进制补0    | 00010000 | 00010100 | 00001000 |          || 分组索引         |   16     |   20     |    8      |          || base64编码       |   Q     |   U      |    I      |   =      |

    列举了一个字符到三个字符转换为 base64 ,可以发现将 base64 就是按照 base64 编码对照表来将二进制转换为字符串,使得数据不能直接明文展示出来,但也算不上是加密,而这巧好可用在传输、存储、表示二进制领域的情景。

    • 另外值得注意的是,不用语言如中文有多种编码(比如:utf-8、gb2312、gbk 等),不同编码对应 base64 编码结果都不一样。

    • 其次在推演过程中可发现 base64 即用 6 位字节(2 的 6 次幂就是 64)表示字符同理,Base32 就是用 5 位字节,Base16 就是用 4 位字节。大家可以按照上面的步骤进行演化测试。

    base64 优缺点

    知道 base64 是什么后,也该到为什么出现了。为什么要是使用 base64 呢,这要从其优缺点入手来选择适合场景了。

    • 优势:

      • base64 适合不同平台、不同语言的传输;

      • 页面中内嵌使用 base64 格式的小图片,可减少了服务器访问次数;

      • 二进制位转换 base64 算法简单,对性能影响不大;

    • 缺点

      • 在基于 Android6.0 及以下默认浏览器实测场景中发现,某些机型如中兴上传 base64 图片会因为字符大小过大导致上传奔溃的情况。

      • 字符长度过大的 base64 不适应使用在 URL 情景,因为 IOS 端浏览器会限制 URL 长度,当长度超过时会自动切除多余部分,导致数据丢失。

      • base64 字符过大会导致页面加载速度变慢,因此建议 10kb 以下的图片使用。

      • 二进制文件转换为 base64 后,体积大概增加 1/3;

      • base64 无法缓存,要缓存只能缓存包含 base64 的文件,比如 js 或者 css;

      • 面对大文件时,会消耗一定的 CPU 进行编解码

    JavaScript 的 base64 转码方法

    Web API 二进制与 base64 转换

    • atob(encodedData) : 解码一个 base64 编码的字符串。

    enCodedData,是一个通过 btoa() 方法编码的字符串, 为二进制字符串包含 base64 编码的数据。并返回包含来自 encodedData 的解码数据的 ASCII 字符串。

    • btoa(stringToEncode) : 创建一个 bas64 编码的字符串。

    stringToEncode 为要编码的二进制字符串。并返回包含 stringToEncode 的 base64 表示形式的 ASCII 字符串。

    另外在 JavaScript 中,字符串使用 UTF-16 字符编码表示:在这种编码中,字符串表示为 16 位(2 字节)单元的序列。每个 ASCII 字符都可以放入其中一个单元的第一个字节,但许多其他字符不能。

    base64 在设计上需要二进制数据作为其输入。就 JavaScript 字符串而言,这意味着每个字符只占用一个字节的字符串。因此,如果将一个字符串传递到 btoa()中,其中包含占用多个字节的字符,则会出现错误,因为这不被视为二进制数据,因此超 16 位字符在使用 btoa()时需要先对字符转码为二进制位。

    // 简单数据const encodedData = btoa('Hello, world'); // encode a stringconst decodedData = atob(encodedData); // decode the string// convert a Unicode string to a string in which// each 16-bit unit occupies only one bytefunction toBinary(string) {  const codeUnits = new Uint16Array(string.length);  for (let i = 0; i < codeUnits.length; i++) {    codeUnits[i] = string.charCodeAt(i);  }  const charCodes = new Uint8Array(codeUnits.buffer);  let result = '';  for (let i = 0; i < charCodes.byteLength; i++) {    result += String.fromCharCode(charCodes[i]);  }  return result;}function fromBinary(binary) {  const bytes = new Uint8Array(binary.length);  for (let i = 0; i < bytes.length; i++) {    bytes[i] = binary.charCodeAt(i);  }  const charCodes = new Uint16Array(bytes.buffer);  let result = '';  for (let i = 0; i < charCodes.length; i++) {    result += String.fromCharCode(charCodes[i]);  }  return result;}// a string that contains characters occupying > 1 byteconst myString = '☸☹☺☻☼☾☿';const converted = toBinary(myString);const encoded = btoa(converted);console.log(encoded); // OCY5JjomOyY8Jj4mPyY=const decoded = atob(encoded);const original = fromBinary(decoded);console.log(original); // ☸☹☺☻☼☾☿
    • 兼容性:atob() 方法不支持 IE9 及更早的 IE 版本。

    base64 转二进制

    // base64编码表const map = {  0: 52,  1: 53,  2: 54,  3: 55,  4: 56,  5: 57,  6: 58,  7: 59,  8: 60,  9: 61,  A: 0,  B: 1,  C: 2,  D: 3,  E: 4,  F: 5,  G: 6,  H: 7,  I: 8,  J: 9,  K: 10,  L: 11,  M: 12,  N: 13,  O: 14,  P: 15,  Q: 16,  R: 17,  S: 18,  T: 19,  U: 20,  V: 21,  W: 22,  X: 23,  Y: 24,  Z: 25,  a: 26,  b: 27,  c: 28,  d: 29,  e: 30,  f: 31,  g: 32,  h: 33,  i: 34,  j: 35,  k: 36,  l: 37,  m: 38,  n: 39,  o: 40,  p: 41,  q: 42,  r: 43,  s: 44,  t: 45,  u: 46,  v: 47,  w: 48,  x: 49,  y: 50,  z: 51,  '+': 62,  '/': 63,};function base64to2(base64) {  let len = base64.length * 0.75; // 转换为int8array所需长度  base64 = base64.replace(/=*$/, ''); // 去掉=号(占位的)  const int8 = new Int8Array(len); //设置int8array视图  let arr1,    arr2,    arr3,    arr4,    p = 0;  for (let i = 0; i < base64.length; i += 4) {    arr1 = map[base64[i]]; // 每次循环 都将base644个字节转换为3个int8array直接    arr2 = map[base64[i + 1]];    arr3 = map[base64[i + 2]];    arr4 = map[base64[i + 3]];    // 假设数据arr 数据 00101011 00101111 00110011 00110001    int8[p++] = (arr1 << 2) | (arr2 >> 4);    // 上面的操作 arr1向左边移动2位 变为10101100    // arr2 向右移动4位:00000010    // | 为'与'操作: 10101110    int8[p++] = (arr2 << 4) | (arr3 >> 2);    int8[p++] = (arr3 << 6) | arr4;  }  return int8;}

    base64 转成 Blob

    // base64图片转blobfunction base64toBlob(base64) {  var arr = base64.split(','),    mime = arr[0].match(/:(.*?);/)[1] || 'image/png',    bstr = atob(arr[1]), // 将base64转为Unicode规则编码    n = bstr.length,    u8arr = new Uint8Array(n);  while (n--) {    u8arr[n] = bstr.charCodeAt(n); // 转换编码后才可以使用charCodeAt 找到Unicode编码  }  return new Blob([u8arr], { type: mime });}function base64ToBlob(base64) {  var arr = base64.split(',');  var mime = arr[0].match(/:(.*?);/)[1] || 'image/png';  // 去掉url的头,并转化为byte  var bytes = window.atob(arr[1]);  // 处理异常,将ascii码小于0的转换为大于0  var ab = new ArrayBuffer(bytes.length);  // 生成视图(直接针对内存):8位无符号整数,长度1个字节  var u8arr = new Uint8Array(ab);  for (var i = 0; i < bytes.length; i++) {    u8arr[i] = bytes.charCodeAt(i);  }  return new Blob([u8arr], { type: mime });}

    到此,关于“base64编码原理是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    base64编码原理是什么

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    base64编码原理是什么

    这篇文章主要介绍“base64编码原理是什么”,在日常操作中,相信很多人在base64编码原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”base64编码原理是什么”的疑惑有所帮助!接下来,请跟着小编
    2023-07-05

    Base64编码的原理是什么

    这篇文章主要讲解了“Base64编码的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Base64编码的原理是什么”吧!Base64是一种基于64个可打印字符来表示二进制数据的表示方
    2023-06-27

    JavaScript中的base64编码原理是什么

    今天小编给大家分享一下JavaScript中的base64编码原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。bas
    2023-07-05

    base64编码指的是什么

    这篇文章给大家分享的是有关base64编码指的是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。base64编码是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表
    2023-06-14

    一文讲清base64编码原理

    本文主要介绍了一文讲清base64编码原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-01

    CSS中图片Base64编码是什么

    小编给大家分享一下CSS中图片Base64编码是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!什么是 base64 编码?  我不是来讲概念的,直接切入正题,图片的 base64 编码就是可以将一副图片数据编码成一串字
    2023-06-15

    深入浅出JavaScript中base64编码原理

    今天翻开旧项目发现挺多图片相关的插件都是用 base64 来显示图片的。谈到 base64,脑海遐想翩翩,思绪回荡之下 base64 瑕瑜互见。这篇文章主要是记录了工作中遇见的问题并加以总结,如有不妥请指正
    2023-02-26

    彻底弄懂Base64的编码与解码原理

    Base64是一种用于将二进制数据转换为可打印字符的编码方式。它使用64个字符来表示任意二进制数据,包括字母(大写和小写)、数字以及两个符号“+”和“/”。编码原理:1. 将二进制数据分割成每6个比特一组(一个比特是二进制的最小单位),每组
    2023-09-23

    JavaScript中的Base64编码字符串是什么

    今天小编给大家分享一下JavaScript中的Base64编码字符串是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。初步
    2023-07-05

    Go语言中的Base64编码原理以及使用是怎样的

    今天就跟大家聊聊有关Go语言中的Base64编码原理以及使用是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前言在网络中传递参数时,我们经常会对参数进行Base64编码,那么G
    2023-06-28

    Java中字符编码的原理是什么

    Java中字符编码的原理是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、Java文件编译后形成class这里Java文件的编码可能有多种多样,但Java
    2023-06-17

    Base64 编码原来这么简单,你知道吗?

    Base58Check 编码,顾名思义是可以对 Base58 编码进行检查。比如我在传输 qH912cvztx编码时,如果网络异常等各种原因,导致数据错乱或丢失,接收方要能够识别出来数据有问题。

    JAVA 中实现 Base64 编码的三种方式分别是什么?(JAVA实现Base64编码的三种方式)

    在JAVA编程中,Base64编码是一种常用的数据编码方式,它将二进制数据编码为ASCII字符串,以便在网络传输或存储中使用。以下是JAVA实现Base64编码的三种方式:方式一:使用Java.util.Base64类
    JAVA 中实现 Base64 编码的三种方式分别是什么?(JAVA实现Base64编码的三种方式)
    Java2024-12-14
    2024-04-02

    Base64编码中为什么会有等号

    这篇文章主要介绍了Base64编码中为什么会有等号的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Base64编码中为什么会有等号文章都会有所收获,下面我们一起来看看吧。Base64编码中为什么会有等号(=)如果
    2023-07-05

    Java 中如何实现 Base64 编码?(java怎么实现base64编码)

    在Java编程中,Base64编码是一种常用的将二进制数据编码为ASCII字符串的方法。它通常用于在网络传输或存储中处理二进制数据,因为ASCII字符串更容易处理和传输。本文将介绍在Java中如何实现Base64编码。一、Base64编码
    Java 中如何实现 Base64 编码?(java怎么实现base64编码)
    Base64Java2024-12-18

    java怎么实现base64编码

    在Java中,可以使用java.util.Base64类来实现Base64编码。下面是一个使用Base64编码的示例代码:```javaimport java.util.Base64;public class Base64Example {
    2023-08-24

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录