Clojure base64编码

26

我希望有一个简单的方法将字符串转换为base64。在旧版本中使用base64.encode-str很简单(也更符合Clojure的风格),但是新版本的clojure.data.codec.base64需要输入和输出流,并且似乎是对Java方式的一种笨拙的封装。

那么,有没有一种方法可以直接将字符串转换为base64编码的数组呢?谢谢。

6个回答

47

四年后,如果您使用JDK 1.8或更高版本,我认为这值得一提。它只是使用了java.util.Base64

将字符串编码为Base64:

(:import java.util.Base64)

(defn encode [to-encode]
  (.encode (Base64/getEncoder) (.getBytes to-encode)))

将字符串编码为 Base64 格式 (字符串):

(:import java.util.Base64)

(defn encode [to-encode]
  (.encodeToString (Base64/getEncoder) (.getBytes to-encode)))

将 Base64(byte[] 或 String)解码为 String:

(:import java.util.Base64)

(defn decode [to-decode]
  (String. (.decode (Base64/getDecoder) to-decode)))

1
请注意,如果您想使字符串URL安全,请使用(Base64/getUrlEncoder)。 - KendallB

20

其他答案还需要一步:将encode的字节数组结果转换为字符串。这是我所做的:

(:require [clojure.data.codec.base64 :as b64])

(defn string-to-base64-string [original]
  (String. (b64/encode (.getBytes original)) "UTF-8"))

6
我认为在clojure.data中添加一个字符串到字符串的函数会很有帮助。 - Brian Marick
1
在我的看法中,为getBytes调用包括编码似乎更安全:(.getBytes original "UTF-8") - LOAS

12
你可以使用encode函数并传递字节数组:
(encode (.getBytes "Hello world!"))

3
是的,尽管字符集可能会导致问题,这也是我省略字符串相关函数的一个原因。 - Alex Taggart
2
现在我应该使用什么(2014年5月)? 因为这个data.codec已经3年没有更新了。 - invis

4

对于那些像我一样尝试将图像转换为数据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)))))

3

1

可能是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文档在这里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接