यहाँ मेरे दो सेंट हैं ... जावा 8 में बेस 64 का अपना कार्यान्वयन शामिल है । हालांकि, मुझे एक थोड़ा परेशान करने वाला अंतर मिला। उदाहरण के लिए, मैं एक कोड उदाहरण प्रदान करूंगा:
मेरा कोडेक आवरण:
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);
}
}
टेस्ट क्लास:
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));
}
}
उत्पादन:
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)
ध्यान दें कि अपाचे एन्कोडेड पाठ में अंत में अतिरिक्त लाइन ब्रेक (सफेद रिक्त स्थान) होते हैं। इसलिए, अपने कोडेक के लिए बेस 64 कार्यान्वयन की परवाह किए बिना एक ही परिणाम प्राप्त करने के लिए, मुझे trim()
अपाचे एन्कोडेड पाठ पर कॉल करना था । मेरे मामले में, मैंने बस अपने कोडेक के लिए उपरोक्त विधि कॉल को इस apacheDecode()
प्रकार जोड़ा है:
return Base64.encodeBase64String(decodedByteArr).trim();
एक बार यह बदलाव किए जाने के बाद, परिणाम वही हैं जिनकी मुझे उम्मीद थी:
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!
निष्कर्ष : यदि आप Apache Base64 से Java में स्विच करना चाहते हैं, तो आपको निम्न करना होगा:
- डिकोड एनकोडेड टेक्स्ट को अपने अपाचे डिकोडर के साथ।
- जावा के साथ परिणामी (सादा) पाठ को एनकोड करें।
यदि आप इन चरणों का पालन किए बिना स्विच करते हैं, तो सबसे अधिक संभावना है कि आप समस्याओं में भाग लेंगे। इस तरह मैंने यह खोज की।