I want something as simple as \"string\" -> base64. With the older base64.encode-str it was easy (and sounded \"more clojure\", but the newer clojure.data.codec.base64
Possible duplicate of Clojure equivalent of python's base64 encode and decode
The Tupelo library has Clojure wrappers around the base Java Base64 and Base64Url functionality. A look at the unit tests show the code in action:
(ns tst.tupelo.base64
(:require [tupelo.base64 :as b64] ))
code-str (b64/encode-str orig)
result (b64/decode-str code-str) ]
(is (= orig result))
where the input & output values are plain strings (there is also a variant for byte arrays).
The API docs are here.
Four years later, but I think this is worth mentioning if you're at JDK 1.8 or greater. It just uses 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)))
For those trying (as I was) to turn images into data URIs (for embedding images in 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)))))
There's one more step needed for the other answer: converting the byte-array result of encode
into a string. Here's what I do:
(:require [clojure.data.codec.base64 :as b64])
(defn string-to-base64-string [original]
(String. (b64/encode (.getBytes original)) "UTF-8"))
You can use encode function and pass array of bytes:
(encode (.getBytes "Hello world!"))
ztellman/byte-transforms also support base64 encode/decode.
(encode "hello" :base64 {:url-safe? true})