我希望有一个简单的方法将字符串转换为base64。在旧版本中使用base64.encode-str很简单(也更符合Clojure的风格),但是新版本的clojure.data.codec.base64
需要输入和输出流,并且似乎是对Java方式的一种笨拙的封装。
那么,有没有一种方法可以直接将字符串转换为base64编码的数组呢?谢谢。
四年后,如果您使用JDK 1.8或更高版本,我认为这值得一提。它只是使用了java.util.Base64
。
(:import java.util.Base64)
(defn encode [to-encode]
(.encode (Base64/getEncoder) (.getBytes to-encode)))
(:import java.util.Base64)
(defn encode [to-encode]
(.encodeToString (Base64/getEncoder) (.getBytes to-encode)))
(:import java.util.Base64)
(defn decode [to-decode]
(String. (.decode (Base64/getDecoder) to-decode)))
其他答案还需要一步:将encode
的字节数组结果转换为字符串。这是我所做的:
(:require [clojure.data.codec.base64 :as b64])
(defn string-to-base64-string [original]
(String. (b64/encode (.getBytes original)) "UTF-8"))
(encode (.getBytes "Hello world!"))
对于那些像我一样尝试将图像转换为数据URI(用于嵌入HTML中的图像)的人:
(defn data-uri
[imagepath]
(str
"data:image/"
(second
(re-find #"\.(.*$)" imagepath))
";base64,"
(.encodeToString
(java.util.Base64/getEncoder)
(org.apache.commons.io.FileUtils/readFileToByteArray
(clojure.java.io/file filepath)))))
可能是Clojure中与Python base64编码和解码等效的方法的重复。
Tupelo库具有Clojure封装的Java Base64和Base64Url功能。查看单元测试可以了解代码的实际操作:
(ns tst.tupelo.base64
(:require [tupelo.base64 :as b64] ))
code-str (b64/encode-str orig)
result (b64/decode-str code-str) ]
(is (= orig result))
输入和输出的值都是普通字符串(也有字节数组的变体)。
API文档在这里。