Đây là hai xu của tôi ... Java 8 có chứa triển khai Base64 của riêng nó . Tuy nhiên, tôi tìm thấy một sự khác biệt hơi đáng lo ngại. Để minh họa, tôi sẽ cung cấp một ví dụ mã:
Trình bao bọc codec của tôi:
public interface MyCodec
{
static String apacheDecode(String encodedStr)
{
return new String(Base64.decodeBase64(encodedStr), Charset.forName("UTF-8"));
}
static String apacheEncode(String decodedStr)
{
byte[] decodedByteArr = decodedStr.getBytes(Charset.forName("UTF-8"));
return Base64.encodeBase64String(decodedByteArr);
}
static String javaDecode(String encodedStr)
{
return new String(java.util.Base64.getDecoder().decode(encodedStr), Charset.forName("UTF-8"));
}
static String javaEncode(String decodedStr)
{
byte[] decodedByteArr = decodedStr.getBytes(Charset.forName("UTF-8"));
return java.util.Base64.getEncoder().encodeToString(decodedByteArr);
}
}
Lớp kiểm tra:
public class CodecDemo
{
public static void main(String[] args)
{
String decodedText = "Hello World!";
String encodedApacheText = MyCodec.apacheEncode(decodedText);
String encodedJavaText = MyCodec.javaEncode(decodedText);
System.out.println("Apache encoded text: " + MyCodec.apacheEncode(encodedApacheText));
System.out.println("Java encoded text: " + MyCodec.javaEncode(encodedJavaText));
System.out.println("Encoded results equal: " + encodedApacheText.equals(encodedJavaText));
System.out.println("Apache decode Java: " + MyCodec.apacheDecode(encodedJavaText));
System.out.println("Java decode Java: " + MyCodec.javaDecode(encodedJavaText));
System.out.println("Apache decode Apache: " + MyCodec.apacheDecode(encodedApacheText));
System.out.println("Java decode Apache: " + MyCodec.javaDecode(encodedApacheText));
}
}
ĐẦU RA:
Apache encoded text: U0dWc2JHOGdWMjl5YkdRaA0K
Java encoded text: U0dWc2JHOGdWMjl5YkdRaA==
Encoded results equal: false
Apache decode Java: Hello World!
Java decode Java: Hello World!
Apache decode Apache: Hello World!
Exception in thread "main" java.lang.IllegalArgumentException: Illegal base64 character d
at java.util.Base64$Decoder.decode0(Base64.java:714)
at java.util.Base64$Decoder.decode(Base64.java:526)
at java.util.Base64$Decoder.decode(Base64.java:549)
Lưu ý rằng văn bản được mã hóa Apache chứa các ngắt dòng bổ sung (khoảng trắng) ở cuối. Do đó, để codec của tôi mang lại kết quả tương tự bất kể việc triển khai Base64, tôi đã phải gọi trim()
văn bản được mã hóa Apache. Trong trường hợp của tôi, tôi chỉ cần thêm lệnh gọi phương thức đã nói ở trên vào codec của mình apacheDecode()
như sau:
return Base64.encodeBase64String(decodedByteArr).trim();
Khi thay đổi này được thực hiện, kết quả là những gì tôi mong đợi bắt đầu bằng:
Apache encoded text: U0dWc2JHOGdWMjl5YkdRaA==
Java encoded text: U0dWc2JHOGdWMjl5YkdRaA==
Encoded results equal: true
Apache decode Java: Hello World!
Java decode Java: Hello World!
Apache decode Apache: Hello World!
Java decode Apache: Hello World!
KẾT LUẬN : Nếu bạn muốn chuyển từ Apache Base64 sang Java, bạn phải:
- Giải mã văn bản được mã hóa bằng bộ giải mã Apache của bạn.
- Mã hóa kết quả văn bản (thuần túy) với Java.
Nếu bạn chuyển đổi mà không làm theo các bước này, rất có thể bạn sẽ gặp vấn đề. Đó là cách tôi thực hiện khám phá này.