javascript - 给定未编码字符串的长度,哪个公式可以揭示 base-64 编码后该字符串的长度?

标签 javascript base64

我正在尝试确定是否存在一个标准的算术公式,给定未编码字符串的长度,该公式将显示该字符串的长度 base-64编码。

这是一个字符串列表及其 base-64编码:

A : QQ==
AB : QUI=
ABC : QUJD
ABCD : QUJDRA==
ABCDE : QUJDREU=
ABCDEF : QUJDREVG
ABCDEFG : QUJDREVGRw==
ABCDEFGH : QUJDREVGR0g=
ABCDEFGHI : QUJDREVGR0hJ
ABCDEFGHIJ : QUJDREVGR0hJSg==
ABCDEFGHIJK : QUJDREVGR0hJSks=
ABCDEFGHIJKL : QUJDREVGR0hJSktM

这里是原始字符串的字符串长度和它们的base-64的长度编码字符串(不包括有时附加到编码末尾的 = 符号):

1 : 2
2 : 3
3 : 4
4 : 6
5 : 7
6 : 8
7 : 10
8 : 11
9 : 12
10 : 14
11 : 15
12 : 16

当应用于左侧的数字时,哪一个公式会导致右侧的数字?

最佳答案

函数 https://stackoverflow.com/a/57945696/230983 正是 Rounin 所需要的。但是如果你想支持 Unicode 字符,你不能依赖 length 方法,所以你需要别的东西来计算字节数。解决这个问题的一个简单方法是使用 blob:

/**
 * Guess the number of Base64 characters required by specified string
 *
 * @param {String} str
 * @returns {Number}
 */
function detectB64CharsLength(str) {
  const blob = new Blob([str]);
  return Math.ceil(blob.size * (4 / 3))
}

/**
 * A dirty hack for encoding Unicode characters to Base64
 * 
 * @link https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem
 * @param {String} data
 * @returns {String}
 */
function utoa(data) {
  return btoa(unescape(encodeURIComponent(data)));
}

// Run some tests and make sure everything is ok
['a', 'ab', 'ββ', '😀'].map(v => {
  console.log(v, detectB64CharsLength(v), utoa(v));
});

关于javascript - 给定未编码字符串的长度,哪个公式可以揭示 base-64 编码后该字符串的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57945655/

相关文章:

javascript - 用鼠标拖动移动 DIV

javascript - 如何获取表格中的总行数?

Javascript - 在函数完成后执行文档调用

javascript - Cypress 期望元素包含一个字符串或另一个字符串

javascript - 解码 Base64 URL 并嵌入 HTML

javascript - vue 将图片转换为base64

c# - Base64 在 C# 中编码 PDF?

javascript - Sencha Extjs - 如何通过一次设置记录中的数据来更新网格?

javascript - 在 ASP.net Core 中使用标签助手将图像上传为 b64 字符串

java - sun.misc.BASE64 到 apache commons