2010-11-15 3 views
22

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

ответ

2

Вы можете использовать с открытым исходным кодом 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=") 
76

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

def encoded = "Hello World".bytes.encodeBase64().toString() 
assert encoded == "SGVsbG8gV29ybGQ=" 
def decoded = new String("SGVsbG8gV29ybGQ=".decodeBase64()) 
assert decoded == "Hello World" 
+0

Проблема с этим состоит в том, что 'encodeBase64' ставит линию строки, заканчивающейся на каждые 76 символов, путает длину из строка. Я закончил использование 'def encoded = byteArray.collect {it as char}' вместо кодировки Base64. –

+9

По умолчанию groovy не вставляет дополнительные строки в кодировку, начиная с версии 1.6.0. Вызов 'encodeBase64 (true)' позволяет это поведение. – ataylor

+2

+1 для простого, сжатого решения, которое я могу использовать в быстром маленьком скрипте (без каких-либо lib-депо), мне нужно проверить некоторые вещи :-) – jpswain

0

Реализовать свой собственный метод, как это :)

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

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

}