Кодировка Base64 в Java / Groovy - PullRequest
       22

Кодировка Base64 в Java / Groovy

26 голосов
/ 15 ноября 2010

Как правильно преобразовать байт [] в строку Base64 в Java? Еще лучше будет Grails / Groovy, потому что он говорит мне, что функция encodeAsBase64() устарела. Пакет sun.misc.BASE64Encoder не рекомендуется для использования и выводит строку другого размера на некоторых платформах Windows.

Ответы [ 5 ]

86 голосов
/ 16 ноября 2010

Предпочтительный способ сделать это в groovy:

 def encoded = "Hello World".bytes.encodeBase64().toString()
 assert encoded == "SGVsbG8gV29ybGQ="
 def decoded = new String("SGVsbG8gV29ybGQ=".decodeBase64())
 assert decoded == "Hello World"
13 голосов
/ 15 ноября 2010

Apache Commons имеет множество утилит:

Двоичный пакет: http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Base64.html

Скачать: http://commons.apache.org/codec/download_codec.cgi

2 голосов
/ 15 ноября 2010

Вы можете использовать открытый код Base64Coder библиотека

import biz.source_code.base64Coder.Base64Coder

@Grab(group='biz.source_code', module='base64coder', version='2010-09-21')

String s1 = Base64Coder.encodeString("Hello world")
String s2 = Base64Coder.decodeString("SGVsbG8gd29ybGQ=")
0 голосов
/ 14 января 2019

(добавляя это в эту ветку в надежде, что кто-то еще получит удар по этому и не должен тратить свое драгоценное время)

Сегодня я зашел в тупик, когда попытался добавить в приложение Grails 2.3.11 / Groovy 2.1.9 вывод

String src = render(
        model:    ...,
        template: ...,
    )
    .encodeAsBase64()

как атрибут data- для элемента DOM. Но atob() в соответствующем JavaScript, то есть код, который декодирует строку Base64 из атрибута данных, продолжал жаловаться на недопустимые символы, в то время как другие декодеры, например, base64 -d без проблем принял ту же строку Base64.

Решение состоит в том, чтобы принудительно вернуть возвращаемое значение render() в одну строку, а затем применить кодировку Base64, т.е.

String src = render(
        model:    ...,
        template: ...,
    )
    .toString()
    .encodeAsBase64()

или (если вы считаете encodeAsBase64() устаревшим):

String src = render(
        model:    ...,
        template: ...,
    )
    .toString()
    .bytes
    .encodeBase64() // add 'true' for chunked output
0 голосов
/ 15 декабря 2014

Реализуйте свой собственный метод следующим образом:)

public class Coder {
private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

public static String encodeAsBase64(String toEncode) {
    return encodeAsBase64(toEncode.getBytes())
}

public static String encodeAsBase64(byte[] toEncode) {
    int pos = 0;
    int onhand = 0;

    StringBuffer buffer = new StringBuffer();
    for(byte b in toEncode) {
        int read = b;
        int m;
        if(pos == 0) {
            m = (read >> 2) & 63;
            onhand = read & 3;
            pos = 1;
        } else if(pos == 1) {
            m = (onhand << 4) + ((read >> 4) & 15);
            onhand = read & 15;
            pos = 2;
        } else if(pos == 2) {
            m = ((read >> 6) & 3) + (onhand << 2);
            onhand = read & 63;
            buffer.append(base64code.charAt(m));
            m = onhand;
            onhand = 0;
            pos  = 0;
        }
        buffer.append(base64code.charAt(m));
    }
    while(pos > 0 && pos < 4) {
        pos++;
        if(onhand == -1) {
            buffer.append('=');
        } else {
            int m = pos == 2 ? onhand << 4 : (pos == 3 ? onhand << 2 : onhand);
            onhand = -1;
            buffer.append(base64code.charAt(m));
        }
    }
    return buffer.toString()
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...