如何在解码 Base64 字符串之前添加填充?

Hen*_*nry 4 coldfusion base64

ColdFusionbinaryDecode(input, 'base64')很挑剔,因为填充是强制性的。

=向 base64 值添加填充的正确方法是什么?

1.)本·纳德尔使用

value &= repeatString( "=", ( 4 - ( len( value ) % 4 ) ) );
Run Code Online (Sandbox Code Playgroud)

2.) Arlo Carreon 使用

<cfset res = Len(raw_str) % 4>
<cfif res eq 2>
     <cfset raw_str &= "==">
<cfelseif res eq 3>
     <cfset raw_str &= "=">
</cfif>
Run Code Online (Sandbox Code Playgroud)

虽然它们似乎都有效,但第一个解决方案可能返回 1 到 4 =,而第二个解决方案可能返回 0、1 或 2 =维基百科上的 Base64 Padding似乎表明有效的 base64 值实际上应该只有 1 或 2 =

第一个解决方案似乎适用于所有 base64 值长度,但有时可能会返回 3 或 4 ,=这有点奇怪。对于余数为 1 的 Base64 值,第二个解决方案可能会失败。CF 抛出The input and output encodings are not same.

Ale*_*lex 6

填充是规范所强制规定的(RFC 2045、3548/4648)。

除非引用本文档的规范明确指出,否则实现必须在编码数据的末尾包含适当的填充字符。

修复缺失填充的正确方法是追加=( len(value) % 4 ) eq 0。这意味着正确填充的 Base64 字符串只能结束:

  • 没有=
  • =
  • ==

规范允许(“可以”)忽略过多的填充。

如果在字符串末尾发现超过允许数量的填充字符(例如,以“===”结尾的 Base 64 字符串),则多余的填充字符也可能会被忽略。


你能详细说明一下你的意思The input and output encodings are not same.吗?这听起来像是无效的 Base64 编码字符串。您可能想检查toBinary()输入返回的内容。它可能会告诉你The parameter 1 of function ToBinary, which is now ... must be a base-64 encoded string,这正是问题所在。

  • 那么正常情况下 `len(value) % 4` 不应该返回 1 吗?谢谢,这就是我需要知道的一切。 (2认同)