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

时间:2015-12-14 23:09:49

标签: coldfusion base64

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

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

1。)Ben Nadel uses

value &= repeatString( "=", ( 4 - ( len( value ) % 4 ) ) );

2。)Arlo Carreon uses

<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.

1 个答案:

答案 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,这正是问题所在。