27

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 requires input and output streams and seems an ugly wrapper around Java way of doing things.

So, what is the way, having a string, to get a base64 encoded array? Thanks

6 Answers 6

51

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

To Encode String → Base64 (String):

(:import java.util.Base64)

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

You can use encode instead of encodeToString if you want a byte array instead.

To Decode Base64 (byte[] or String) → String:

(:import java.util.Base64)

(defn decode [to-decode]
  (String. (.decode (Base64/getDecoder) to-decode)))
Sign up to request clarification or add additional context in comments.

1 Comment

Note, if you want the string to be URL safe use (Base64/getUrlEncoder)
20

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"))

2 Comments

I do think that a string-to-string function would be a helpful addition to clojure.data.
It seems safer to me to include encoding for the getBytes call as well: (.getBytes original "UTF-8")
12

You can use encode function and pass array of bytes:

(encode (.getBytes "Hello world!"))

2 Comments

Yup, though the charset can screw that up, which is one reason I omitted the string-related functions.
What should I use now (may 2014)? Because this data.codec have last commit 3 years ago.
5

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)))))

Comments

3

ztellman/byte-transforms also support base64 encode/decode.

(encode "hello" :base64 {:url-safe? true})

Comments

1

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.