Berikut adalah dua sen saya ... Java 8 memang mengandung implementasi Base64 sendiri . Namun, saya menemukan satu perbedaan yang sedikit mengganggu. Sebagai ilustrasi, saya akan memberikan contoh kode:
Pembungkus codec saya:
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);
}
}
Kelas Tes:
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));
}
}
KELUARAN:
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)
Perhatikan bahwa teks yang disandikan Apache berisi jeda baris tambahan (spasi putih) di bagian akhir. Oleh karena itu, agar codec saya menghasilkan hasil yang sama terlepas dari implementasi Base64, saya harus menelepontrim()
teks yang disandikan Apache. Dalam kasus saya, saya cukup menambahkan pemanggilan metode yang disebutkan di atas ke codec saya apacheDecode()
sebagai berikut:
return Base64.encodeBase64String(decodedByteArr).trim();
Setelah perubahan ini dibuat, hasilnya adalah apa yang saya harapkan dimulai dengan:
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!
KESIMPULAN : Jika Anda ingin beralih dari Apache Base64 ke Java, Anda harus:
- Dekode teks yang disandikan dengan dekoder Apache Anda.
- Menyandikan teks (biasa) yang dihasilkan dengan Java.
Jika Anda beralih tanpa mengikuti langkah-langkah ini, kemungkinan besar Anda akan mengalami masalah. Begitulah cara saya membuat penemuan ini.