Javascript 给定一个未编码字符串的长度,哪一个公式可以显示该字符串在base-64编码后的长度?
我试图确定是否有一个标准的算术公式,给定未编码字符串的长度,该公式将在对该字符串进行Javascript 给定一个未编码字符串的长度,哪一个公式可以显示该字符串在base-64编码后的长度?,javascript,base64,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 :
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
编码字符串的长度(不包括有时附加到编码末尾的=
符号):
哪一个公式,当应用于左边的数字时,会导致右边的数字?当我完成上面的问题时,我意识到(我想)这个公式是什么
getLengthOfStringAfterBase64Encoding = (string) => {
const stringLength = string.length;
const base64EncodedStringLength = stringLength + Math.ceil(stringLength / 3);
return base64EncodedStringLength;
}
你的问题很混乱,因为你说“不包括有时附加到编码末尾的=符号” 我并不是说base64编码结果的non-=部分的长度是无趣的——也许您有充分的理由想知道这一点 但是,如果您试图计算base64编码结果所需的存储空间,则需要包括=符号的存储空间;没有它们,base64结果无法解码。注意:
echo -n 'ABCDE' | base64
QUJDREU=
$ echo -n 'QUJDREU=' | base64 --decode | od -c
0000000 A B C D E
$ echo -n 'QUJDREU' | base64 --decode | od -c
0000000 A B C
注意#1:可以不存储=-符号,因为可以计算给定base64结果中缺少这些符号的时间;严格来说,不需要存储它们,但需要为解码操作提供它们。但是,您需要一个自定义解码操作,首先查看填充是否丢失。我敢打赌,存储至少2个额外字节远比定制base64解码函数的麻烦/复杂性/意外性便宜
注意#2:根据后续评论,一些库具有支持缺少填充的base64函数。填充的处理是特定于实现的。在某些情况下,填充是强制性的(根据相关规范)。以下每一项都是对任何特定库的填充的合理处理:
length
方法,因此需要其他方法来计算字节数。解决此问题的一个简单方法是使用BLOB:
/**
*猜测指定字符串所需的Base64字符数
*
*@param{String}str
*@返回{Number}
*/
功能检测TB64字符长度(str){
const blob=新blob([str]);
返回数学单元(blob.size*(4/3))
}
/**
*将Unicode字符编码为Base64的一个肮脏的黑客
*
*@linkhttps://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem
*@param{String}数据
*@返回{String}
*/
功能utoa(数据){
返回btoa(unescape(encodeURIComponent(data));
}
//运行一些测试,确保一切正常
这是否回答了你的问题:ceil(n/3)*4
?可能类似于Math.ceil(str.length*(4/3))
@Rounin:从回答中可以看出,你的问题的“答案”比第一眼看到的要微妙一些,请参考:1),它明确地说“…在某些情况下,在基本编码数据中不需要或不使用填充(=”)。
”.2,其中讨论了JSatob()
,btoa()
,以及“Unicode问题”。这不起作用。让str=''btoa(str.length==180,但str.length+Math.ceil(str.length/3)==178我认为没有答案,因为base64字符串的长度取决于编码的内容。字符串长度为133,但base64编码的长度为180。根据您的公式得出178。请使用以下字符串尝试您的示例:ausd8aud8as7d897ad7a89sdad。它以1为准。我认为差异来自问题的这一部分:不包括有时附加到编码结尾的=符号“…我会问你,鲁宁-你为什么忽略这些=符号?它们是base64编码结果的一部分…换句话说,你不应该命名你的函数GetLengthofsTringAfterBase64 encoding()
如果您忽略了base64编码的一部分……事实上,@carson是正确的,但这并不是因为计算了填充字符。问题是任何依赖.length
方法的函数都会为Unicode字符提供错误的结果。例如,GetLengthofsTringAfterbase64编码('ββ'))
返回3
,而它应该是6
,因为β
被编码为zrLOsg==
。谢谢你,@landru27。这很有趣。使用javascriptwindow.atob()
函数,我在解码QUJDREU=
和QUJDR之后看到了相同的结果
echo -n 'ABCDE' | base64
QUJDREU=
$ echo -n 'QUJDREU=' | base64 --decode | od -c
0000000 A B C D E
$ echo -n 'QUJDREU' | base64 --decode | od -c
0000000 A B C