我要求:
[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解码功能是否已损坏?或者我做错了什么?提前谢谢!
答案 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=")))
现在提供预期的输出。