Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 给定一个未编码字符串的长度,哪一个公式可以显示该字符串在base-64编码后的长度?_Javascript_Base64 - Fatal编程技术网

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
编码字符串的长度(不包括有时附加到编码末尾的
=
符号):


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

当我完成上面的问题时,我意识到(我想)这个公式是什么

  • 将原始字符串长度除以3
  • 把那个新数字加起来
  • 将四舍五入的新数字添加到原始字符串长度
  • 像这样:

    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函数。填充的处理是特定于实现的。在某些情况下,填充是强制性的(根据相关规范)。以下每一项都是对任何特定库的填充的合理处理:

  • 隐式填充:假定输入的填充字符长度比4字节的倍数短一个或两个字节(注意:短3字节仍然无效,因为base64编码只能短0、1或2字节)

  • 尽力解码:解码输入中可被4字节整除的最长部分

  • 假设截断:将长度不可被4字节整除的输入视为无效拒绝,前提是这表示传输不完整

  • 同样,哪一个最正确将取决于相关代码运行的上下文,不同的库作者将对此做出不同的决定

    来自@Victor的答案是最好的答案;它与问题的上下文(Javascript)关系最为密切,同时也考虑了关键的字节与字符问题。

    函数正是Rounin所需要的。但是,如果您想支持Unicode字符,就不能依赖
    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,其中讨论了JS
    atob()
    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。这很有趣。使用javascript
    window.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