ColdFusion的binaryDecode(input, 'base64')
很挑剔,因为填充是强制性的。
将=
的填充添加到base64值的正确方法是什么?
1。)Ben Nadel uses:
value &= repeatString( "=", ( 4 - ( len( value ) % 4 ) ) );
<cfset res = Len(raw_str) % 4>
<cfif res eq 2>
<cfset raw_str &= "==">
<cfelseif res eq 3>
<cfset raw_str &= "=">
</cfif>
虽然它们似乎都有效,但第一个解决方案可能会返回1到4个=
,而第二个解决方案可能会返回0,1或2个=
。 Wikipedia on Base64 Padding似乎表明有效的base64值应该只有1或2个=
。
第一个解决方案似乎适用于所有base64值的长度,但它有时可能返回3或4 =
,这有点奇怪。对于剩余为1的base64值,第二个解决方案可能失败的地方.CF抛出The input and output encodings are not same.
答案 0 :(得分:1)
填充是规范必需的(RFC 2045,3548 / 4648)。
实现必须在编码数据的末尾包含适当的填充字符,除非引用本文档的规范另有明确说明。
修复缺失填充的正确方法是将=
追加到( len(value) % 4 ) eq 0
。这意味着正确填充的Base64字符串只能结束:
=
=
==
规范允许(“可能”)忽略过多的填充。
如果在字符串的末尾找到超过允许的填充字符数(例如,以“===”结尾的基本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
,这正是问题所在。