2012-07-23 47 views
8

Đang cố gắng để chuyển đổi một byte[] chuỗi base64 sử dụng org.apache.commons.codec.binary.Base64 ..For này mã java của tôi trông giống như:Chuyển đổi mảng byte để base64 chuỗi java

base64String = Base64.encodeBase64URLSafeString(myByteArray); 

Nhưng những gì tôi thấy là một số ký tự không hợp lệ trong tạo base64 chuỗi .. ScreenShot

Tại sao tôi thấy các dòng ____ trong chuỗi base64 được tạo của tôi? Đây có phải là chuỗi hợp lệ không? Lưu ý độ dài của chuỗi được tạo ra có thể chia cho bốn.

+1

bạn đã cố gắng giải mã đầu ra của bạn? Ngoài ra, bạn có đang sử dụng dữ liệu base64 được mã hóa trong URL không. Chỉ sử dụng phiên bản URLSafe khi mã hóa base64 đi vào một http/get hoặc một số hoạt động liên quan đến url khác. – maasg

+0

http://en.wikipedia.org/wiki/Base64#URL_applications – nullpotent

+0

Điều này có thể giúp http://stackoverflow.com/questions/6265912/javax-xml-binds-base64-encoder-decoder-eats-last-two- ký tự-của-chuỗi – tsm

Trả lời

2

này có thể hữu ích

sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder(); 
encoder.encode(byteArray); 
+14

Đây là lời khuyên không tốt --- Hệ thống phân cấp gói 'sun.misc' không dành cho mục đích sử dụng công cộng. –

+0

Tôi không muốn đi với 'sun.misc' –

0

bạn đã có (ít nhất) hai hương vị của base64, là gốc sử dụng '+' và '/', thêm vào ký tự chữ và số "url an toàn "một, sử dụng" - "và" _ "sao cho nội dung có thể được đính kèm trong một URL (hoặc được sử dụng làm tên tệp, btw).

Dường như bạn đang sử dụng bộ mã hóa base64 đã được chuyển thành "chế độ an toàn url".

apache's javadoc for URLSafeString()

Oh, và '_' là ký tự cuối cùng của bảng chữ cái base64, nhìn thấy chuỗi "____" nghĩa là bạn đã được mã hóa khối của 0xffffff ..., giống như nhìn thấy "aaaaaa" có nghĩa là có rất nhiều số 0 liên tiếp.

Nếu bạn muốn được thuyết phục rằng đó là trường hợp bình thường, chỉ cần chọn trình biên tập/biên tập thập lục phân yêu thích của bạn và kiểm tra xem đầu vào nhị phân của bạn trông như thế nào.

+0

Tìm một bình luận hợp lệ trong tất cả có tôi đã có'/'và replcaed phương pháp econding với' encodeBase64URLSafeString' để tránh slashes .. Sau đó, tất cả bắt đầu với '_' .. Tất cả tôi cần biết là ở trên là một chuỗi base64 hợp lệ? Vui lòng đề nghị. –

+0

bạn đang hỏi xem chuỗi có khớp với [0-9A-Za-z _-] + hoặc [0-9A-Za-z/+] + không? mà âm thanh như một công việc cho một regexp. – PypeBros

0

Bằng quá trình bên dưới, bạn có thể chuyển đổi mảng byte để Base64

// Convert a byte array to base64 string 
    byte[] bytearray= new byte[]{0x12, 0x23}; 
    String s = new sun.misc.BASE64Encoder().encode(bytearray); 

    // Convert base64 string to a byte array 
    bytearray = new sun.misc.BASE64Decoder().decodeBuffer(s); 

Edit:

Vui lòng kiểm tra hướng dẫn bên dưới liên kết commons apache

+0

'sun.misc.BASE64Decoder()' ?? Tại sao cố gắng với apache commons –

+2

sun.misc là một cái gì đó nội bộ để thực hiện của Sun của gói java/javax. Không có gì đảm bảo rằng nó sẽ luôn ở đó (đặc biệt là trên một JVM khác) và giao diện của nó sẽ không thay đổi trên các phiên bản khác nhau của JVM, afaik. – PypeBros

2

bạn đã thử với phương pháp encodeBase64String thay vì sử dụng encodeBase64URLSafeString?

encodeBase64URLSafeString:

Mã hóa dữ liệu nhị phân sử dụng một biến thể URL an toàn của thuật toán base64 nhưng không đoạn đầu ra. Biến thể an toàn url phát ra - và _ thay vì + và/ký tự.

encodeBase64String:

Mã hóa dữ liệu nhị phân bằng cách sử dụng thuật toán base64 nhưng không đoạn các đầu ra. LƯU Ý: Chúng tôi đã thay đổi hành vi của phương pháp này từ nhiều dòng chunking (commons-codec-1.4) thành một dòng không chunking (commons-codec-1.5).

nguồn: org.apache.commons.codec.binary.Base64 javadoc

0

Sử dụng

String sCert = javax.xml.bind.DatatypeConverter.printBase64Binary(pk); 
Các vấn đề liên quan