2015-12-14 123 views
1

ColdFusion的binaryDecode(input, 'base64')是挑剔的,因为填充是强制性的。如何在解码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 ='s。 Wikipedia on Base64 Padding似乎表明有效的base64值应该只有1或2个='s。

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

+0

为什么你需要做自己的填充? – Leigh

+0

Json Web Token中的@Leigh Base64URL通常/始终删除填充。要将这样的值提供给'binaryDecode(input,'base64')',必须添加填充。 – Henry

回答

0

填充由规范(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,这正是问题所在。

+0

当len(value)%4'返回1时,它应该是0,1还是2'='?看起来没有任何一个选项会产生超值的提示= 0 – Henry

+0

在这种情况下,您的输入是不完整的。在哪里/如何获得返回1的输入? – Alex

+0

所以'len(value)%4'在正常情况下永远不应该返回1?谢谢,这就是我需要知道的。 – Henry