Clojure中出现意外的base 64解码结果

时间:2014-04-15 11:41:03

标签: clojure base64 clojure-contrib

我要求:

[clojure.data.codec.base64 :as b64]

我已经定义了一个函数:

(defn toHexString [bytes]
  "Convert bytes to a String"
  (apply str (map #(format "%x" %) bytes)))

我运行此代码以在Clojure中获得结果:

(toHexString (b64/decode (.getBytes "WR0frsVTzVg8QdA9l45/MuYZ3GUKGynDF7WaEYcjudI")))

我还在PHP中运行此代码以进行比较(我确信PHP结果是正确的):

echo bin2hex(base64_decode("WR0frsVTzVg8QdA9l45/MuYZ3GUKGynDF7WaEYcjudI"));

我分别得到了Clojure和PHP的这些结果:

591d1faec553cd583c41d03d978e7f32e619dc65a1b29c317b59a118723
591d1faec553cd583c41d03d978e7f32e619dc650a1b29c317b59a118723b9d2

请注意,结果几乎完全相同。唯一的区别是Clojure结果中间缺少0和缺少4个字符。

我不知道我在这里做错了什么。 Clojure中的base64解码功能是否已损坏?或者我做错了什么?提前谢谢!

1 个答案:

答案 0 :(得分:4)

您的toHexString需要0-pad表示可以表示为单个十六进制数字的字节:

 (defn to-hex-string [bytes] (apply str (map #(format "%02x" %) bytes)))

您的base64输入的长度为43,因此需要将其填充为4的倍数,或者使用不需要填充的实现进行解码。看起来PHP接受非填充输入,而这个Clojure不会(截断)。用" ="。

填充
(to-hex-string (b64/decode (.getBytes "WR0frsVTzVg8QdA9l45/MuYZ3GUKGynDF7WaEYcjudI=")))

现在提供预期的输出。