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.
填充是规范所强制规定的(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,这正是问题所在。
| 归档时间: |
|
| 查看次数: |
8807 次 |
| 最近记录: |