Clojure中意外的base 64解码结果

Clojure中意外的base 64解码结果,clojure,base64,clojure-contrib,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/MuYZ3GUKGynDF7WaEY

我要求:

[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结果是正确的):

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

591d1faec553cd583c41d03d978e7f32e619dc65a1b29c317b59a118723
591d1faec553cd583c41d03d978e7f32e619dc650a1b29c317b59a118723b9d2
请注意,结果几乎完全相同。唯一的区别是中间缺失了0个,在Culjress结果的末尾有四个缺失的字符。
我不知道我做错了什么。Clojure中的base64解码函数是否已损坏?或者我做错了什么?提前谢谢

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

 (defn to-hex-string [bytes] (apply str (map #(format "%02x" %) bytes)))
base64输入的长度为43,因此需要将其填充到4的倍数,或者使用不需要填充的实现进行解码。看起来PHP接受非填充输入,而此Clojure不接受(截断)。用“=”填充


这将给出预期的输出。

谢谢!你解决了我的头痛!只是一个简单的问题,你怎么知道在结尾加一个等号?@ibopm解码的文档字符串指定输入长度必须是4的倍数。使用padding时,
=
padding是标准的,所以我只是尝试了一下。这可能要求太高了,但您介意给我一个示例,说明如何制作一个函数,检查字符串输入长度是否是4的倍数,如果不是,则用“=”填充,直到它变长为止吗?我对函数式编程非常陌生,希望能给我举个例子,谢谢!如果您愿意,我可以为此创建一个新问题。
(defn pad to multiple[s m pad](应用str s(repeat(mod(-0(count s))m)pad))
 (defn to-hex-string [bytes] (apply str (map #(format "%02x" %) bytes)))
(to-hex-string (b64/decode (.getBytes "WR0frsVTzVg8QdA9l45/MuYZ3GUKGynDF7WaEYcjudI=")))