4

我要求:

[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 和末尾缺少四个字符。

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

4

1 回答 1

4

toHexString需要对可以表示为单个十六进制数字的字节进行 0 填充:

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

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

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

这现在给出了预期的输出。

于 2014-04-15T12:20:53.500 回答