2010-11-15 7 views
22

Jaki jest właściwy sposób konwertowania bajta [] na ciąg Base64 w języku Java? Jeszcze lepiej byłoby Grails/Groovy, ponieważ mówi mi, że funkcja encodeAsBase64() jest przestarzała. Pakiet sun.misc.BASE64Encoder nie jest zalecany do użycia i wyprowadza inny rozmiar na niektórych platformach Windows.Kodowanie Base64 w języku Java/Groovy

Odpowiedz

2

można użyć open source Base64Coder bibliotekę

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

preferowany sposób zrobić to w groovy jest:

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

Problem polega na tym, że 'encodeBase64' stawia linię linię kończącą się co 76 znaków, które bałagan długości strunowy. W końcu użyłem 'def encoded = byteArray.collect {it char char} zamiast kodowania Base64. –

+9

Domyślnie groovy nie wstawia dodatkowych znaków nowej linii w kodowaniu od wersji 1.6.0. Wywołanie 'encodeBase64 (true)' włącza to zachowanie. – ataylor

+2

+1 dla prostego, zwięzłego rozwiązania, którego mogę użyć w krótkim małym skrypcie (bez żadnych bibliotek) potrzebuję do sprawdzenia pewnych rzeczy :-) – jpswain

0

zaimplementować własną metodę tak :)

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

}