2010-11-15 37 views
22

Cách thích hợp để chuyển đổi một byte [] thành chuỗi Base64 trong Java là gì? Tốt hơn là Grails/Groovy vì nó cho tôi biết rằng hàm encodeAsBase64() không được chấp nhận. Gói sun.misc.BASE64Encoder không được khuyến nghị sử dụng và xuất ra một chuỗi kích thước khác trên một số nền tảng Windows.Mã hóa Base64 trong Java/Groovy

Trả lời

2

Bạn có thể sử dụng mã nguồn mở Base64Coder thư viện

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

Cách ưa thích để làm điều này trong groovy là:

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

Vấn đề với điều này là 'encodeBase64' đặt dòng một dòng kết thúc trong mỗi 76 ký tự mà messes lên theo chiều dài của chuỗi. Tôi đã kết thúc bằng cách sử dụng 'def encoded = byteArray.collect {nó như char}' thay vì mã hóa Base64. –

+9

Theo mặc định, groovy không chèn thêm dòng mới trong mã hóa, kể từ phiên bản 1.6.0. Gọi 'encodeBase64 (true)' cho phép hành vi đó. – ataylor

+2

+1 cho một giải pháp đơn giản, ngắn gọn mà tôi có thể sử dụng trong một kịch bản nhanh chóng (không có bất kỳ deps lib) tôi cần phải kiểm tra một số điều :-) – jpswain

0

Thực hiện phương pháp riêng của bạn như thế này :)

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

}

Các vấn đề liên quan