我正在尝试确定是否存在一个标准的算术公式,给定未编码字符串的长度,该公式将显示该字符串的长度 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/