2016-06-30 4 views
1

Я очень новый в clojure. У меня нет опыта работы с java &, это функции библиотеки. Я написал функцию в clojure, которые возвращают зашифрованные данные base64, используя java.util.Base64/getUrlEncoder. Мой код выглядит следующим образом:Как получить зашифрованные данные без заполнения?

user> (import java.util.Base64) 
java.util.Base64 
user> (let [encoder (Base64/getUrlEncoder)] 
     (String. (.encode encoder (.getBytes "Hello StackOverflow")))) 
"SGVsbG8gU3RhY2tPdmVyZmxvdw==" 

Выход содержит отступы, а также (два знака равенства в последнем). Я хочу, чтобы удалить прокладку с моего выхода. https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html#withoutPadding-- Я знаю, что это полезно для решения моей проблемы, но я не могу понять, как использовать withoutPadding() Функция в clojure. Я пробовал что-то вроде этого:

user> (let [encoder (Base64/getUrlEncoder))] 
     (doto (java.util.Base64/Encoder (.withoutPadding (String. (.encode encoder (.getBytes "Hello StackOverflow")))))) 

Но это неправильно. может ли кто-нибудь сказать точное решение? Благодарю.

+0

Base64 выходы кратны 4 байта, если вход не требуется, чтобы выход проложенный с «=» символов, то есть, как Base64 работы , Можно удалить символы «=», и декодеры сонов могут принять это, но не большинство. Вы можете восстановить и удалить до декодирования на основе длины Base64, но это не рекомендуется. Просто оставьте прокладку, это обычная практика. – zaph

+0

, чтобы быть ясным, base64 не является методом шифрования, это кодирование – noisesmith

ответ

4

Вы должны вызвать withoutPadding на самом кодировщик:

user> (import java.util.Base64) 
java.util.Base64 
user> (let [encoder (Base64/getUrlEncoder)] 
     (String. (.encode encoder (.getBytes "Hello StackOverflow")))) 
"SGVsbG8gU3RhY2tPdmVyZmxvdw==" 
user> (let [encoder (.withoutPadding (Base64/getUrlEncoder))] 
     (String. (.encode encoder (.getBytes "Hello StackOverflow")))) 
"SGVsbG8gU3RhY2tPdmVyZmxvdw"