Java में Base64 decode एक ऐसी चीज़ है जिसकी ज़रूरत मुझे हर कुछ दिनों में पड़ती है — Kubernetes environment variables से secrets निकालना, REST APIs से binary payloads पढ़ना, debugging सेशन के दौरान JWT टोकन inspect करना। Java का बिल्ट-इन java.util.Base64 क्लास (JDK 8 से) तीन decoder फ्लेवर प्रदान करता है: स्टैंडर्ड Base64 के लिए getDecoder(), URL-safe इनपुट के लिए getUrlDecoder(), और ईमेल अटैचमेंट जैसे लाइन-रैप्ड डेटा के लिए getMimeDecoder()। कोड लिखे बिना त्वरित जाँच के लिए, ToolDeck का Base64 decoder इसे आपके ब्राउज़र में तुरंत हैंडल करता है। यह गाइड Java 8+ को टारगेट करती है और तीनों decoder, wrap(InputStream) के साथ स्ट्रीमिंग, JWT payload extraction, फ़ाइल और API response डिकोडिंग, Apache Commons Codec को एक विकल्प के रूप में, और production में garbage आउटपुट देने वाली चार सामान्य गलतियाँ कवर करती है।
- ✓Base64.getDecoder().decode(s) स्टैंडर्ड तरीका है — JDK 8 से java.util.Base64 में बिल्ट-इन है, कोई dependency नहीं चाहिए।
- ✓JWT टोकन और OAuth payloads के लिए getUrlDecoder() उपयोग करें — वे + और / की जगह - और _ अल्फाबेट उपयोग करते हैं।
- ✓getMimeDecoder() लाइन ब्रेक और व्हाइटस्पेस को अनदेखा करता है, जो ईमेल अटैचमेंट और PEM सर्टिफिकेट के लिए सही विकल्प है।
- ✓decoder.wrap(InputStream) बड़ी फ़ाइलों के लिए सब कुछ मेमोरी में लोड किए बिना ऑन-द-फ्लाई डिकोड करता है।
- ✓बेसिक डिकोडर कड़ा है — ट्रेलिंग न्यूलाइन, स्पेस, या गलत अल्फाबेट कैरेक्टर तुरंत IllegalArgumentException थ्रो करते हैं।
Base64 डिकोडिंग क्या है?
Base64 एन्कोडिंग binary डेटा को 64-कैरेक्टर ASCII representation में बदलती है ताकि यह text-only channels — JSON फील्ड, HTTP headers, XML दस्तावेज़, ईमेल बॉडी — से सुरक्षित रूप से गुज़र सके। डिकोडिंग इसे उलटा करती है: प्रत्येक 4 Base64 कैरेक्टर मूल 3 bytes में वापस मैप होते हैं। अंत में = पैडिंग बताती है कि अंतिम ग्रुप भरने के लिए कितने bytes जोड़े गए थे। Base64 एन्क्रिप्शन नहीं है — कोई भी इसे रिवर्स कर सकता है। इसका मकसद गोपनीयता नहीं — बस binary data को बिना corruption के text channels से भेजना है।
Java डिकोडिंग के सामान्य परिदृश्य: Base64 environment variables के रूप में inject किए गए configuration values निकालना, cloud API responses से binary फ़ाइल content अनपैक करना, PEM-encoded सर्टिफिकेट पढ़ना, और debugging के दौरान JWT टोकन payloads inspect करना।
ZGItcHJvZC51cy1lYXN0LTEuYW1hem9uYXdzLmNvbTo1NDMy
db-prod.us-east-1.amazonaws.com:5432
Base64.getDecoder().decode() — स्टैंडर्ड डिकोडिंग मेथड
java.util.Base64 क्लास JDK 8 में जोड़ी गई थी और इसने पुराने sun.misc.BASE64Decoder की जगह ली जिस पर सभी निर्भर थे। कोई external dependency नहीं चाहिए — बस import java.util.Base64 करें और Base64.getDecoder().decode() कॉल करें। यह मेथड String या byte[] दोनों स्वीकार करता है और decoded डेटा का byte[] लौटाता है।
Minimal Working Example
import java.util.Base64;
import java.nio.charset.StandardCharsets;
public class DecodeCredential {
public static void main(String[] args) {
// Kubernetes secret value, Base64-encoded
String encoded = "ZGItcHJvZC51cy1lYXN0LTEuYW1hem9uYXdzLmNvbTo1NDMy";
byte[] decodedBytes = Base64.getDecoder().decode(encoded);
String connectionString = new String(decodedBytes, StandardCharsets.UTF_8);
System.out.println(connectionString);
// db-prod.us-east-1.amazonaws.com:5432
}
}String बनाते समय हमेशा StandardCharsets.UTF_8 निर्दिष्ट करें। बिना argument वाला new String(bytes) constructor प्लेटफ़ॉर्म की default encoding उपयोग करता है, जो सिस्टम के बीच अलग-अलग होती है। Cp1252 को default के रूप में उपयोग करने वाले Windows सर्वर पर, multi-byte UTF-8 कैरेक्टर चुपचाप corrupt हो जाते हैं।
Round-trip Test
import java.util.Base64;
import java.nio.charset.StandardCharsets;
public class RoundTrip {
public static void main(String[] args) {
String original = "redis://cache-prod.internal:6379/session-store";
String encoded = Base64.getEncoder().encodeToString(
original.getBytes(StandardCharsets.UTF_8)
);
System.out.println(encoded);
// cmVkaXM6Ly9jYWNoZS1wcm9kLmludGVybmFsOjYzNzkvc2Vzc2lvbi1zdG9yZQ==
byte[] decoded = Base64.getDecoder().decode(encoded);
String recovered = new String(decoded, StandardCharsets.UTF_8);
System.out.println(recovered.equals(original)); // true
}
}Pre-allocated Buffer में डिकोड करना
तीन-argument वाला decode(byte[] src, byte[] dst) ओवरलोड सीधे destination बफर में लिखता है और लिखे गए bytes की संख्या लौटाता है। यह hot paths पर अतिरिक्त allocation से बचाता है:
import java.util.Base64;
public class DecodeToBuffer {
public static void main(String[] args) {
byte[] src = "eyJob3N0IjoiMTAuMC4xLjUwIiwicG9ydCI6ODQ0M30=".getBytes();
byte[] dst = new byte[1024]; // pre-allocated
int len = Base64.getDecoder().decode(src, dst);
String result = new String(dst, 0, len);
System.out.println(result);
// {"host":"10.0.1.50","port":8443}
}
}decode() तब IllegalArgumentException थ्रो करता है जब इनपुट में Base64 अल्फाबेट के बाहर कैरेक्टर हों (जिनमें लाइन ब्रेक और स्पेस शामिल हैं)। यदि आपके इनपुट में व्हाइटस्पेस हो सकता है, तो getMimeDecoder() पर स्विच करें या डिकोड करने से पहले encoded.strip() से उसे हटाएँ।गैर-स्टैंडर्ड टाइप और कस्टम ऑब्जेक्ट के साथ Base64 डिकोडिंग
decode() से मिला raw byte[] अक्सर कुछ अधिक specific बनाने की आवश्यकता होती है: UUID, serialized Java object, protobuf message, या timestamp। डिकोडर हमेशा bytes लौटाता है — domain types में conversion आपकी ज़िम्मेदारी है।
Base64 से UUID
import java.util.Base64;
import java.nio.ByteBuffer;
import java.util.UUID;
public class DecodeUUID {
public static UUID fromBase64(String encoded) {
byte[] bytes = Base64.getUrlDecoder().decode(encoded);
ByteBuffer bb = ByteBuffer.wrap(bytes);
return new UUID(bb.getLong(), bb.getLong());
}
public static void main(String[] args) {
// Compact Base64-encoded UUID from an API response
String encoded = "f47ac10b-58cc-4372-a567-0e02b2c3d479";
UUID original = UUID.fromString(encoded);
// Encode to Base64 (compact form — 22 chars vs 36)
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(original.getMostSignificantBits());
bb.putLong(original.getLeastSignificantBits());
String compact = Base64.getUrlEncoder().withoutPadding()
.encodeToString(bb.array());
System.out.println(compact); // 9HrBC1jMQ3KlZw4CssPUeQ
// Decode back
UUID recovered = fromBase64(compact);
System.out.println(recovered); // f47ac10b-58cc-4372-a567-0e02b2c3d479
}
}Jackson के साथ Base64 से deserialized JSON ऑब्जेक्ट
import java.util.Base64;
import java.nio.charset.StandardCharsets;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.time.Instant;
public class DecodeJsonPayload {
record DeployEvent(String service, String region, Instant deployedAt, int replicas) {}
public static void main(String[] args) throws Exception {
// Base64-encoded JSON payload from a message queue
String encoded = "eyJzZXJ2aWNlIjoicGF5bWVudC1nYXRld2F5Iiwi"
+ "cmVnaW9uIjoiZXUtd2VzdC0xIiwiZGVwbG95ZWRBdCI6"
+ "IjIwMjYtMDMtMTVUMTQ6MzA6MDBaIiwicmVwbGljYXMiOjR9";
byte[] jsonBytes = Base64.getDecoder().decode(encoded);
String json = new String(jsonBytes, StandardCharsets.UTF_8);
System.out.println(json);
// {"service":"payment-gateway","region":"eu-west-1",
// "deployedAt":"2026-03-15T14:30:00Z","replicas":4}
ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules(); // picks up JavaTimeModule
DeployEvent event = mapper.readValue(jsonBytes, DeployEvent.class);
System.out.println(event.service()); // payment-gateway
System.out.println(event.deployedAt()); // 2026-03-15T14:30:00Z
}
}ObjectInputStream उपयोग न करें। Java deserialization attacks अच्छी तरह से documented हैं — यदि encoded content किसी external source से आता है, तो native Java serialization के बजाय इसे JSON या protobuf के रूप में parse करें।Base64.Decoder मेथड रेफरेंस
सभी मेथड java.util.Base64 और उसकी inner class Base64.Decoder से संबंधित हैं। Base64 पर तीन factory methods अलग-अलग decoder instance लौटाती हैं; decode() और wrap() मेथड Decoder instance पर होते हैं।
getMimeDecoder() — लाइन-रैप्ड और MIME Base64 डिकोडिंग
बेसिक डिकोडर Base64 अल्फाबेट के बाहर किसी भी चीज़ को अस्वीकार करता है — और इसमें वे \r\n लाइन ब्रेक भी शामिल हैं जो MIME-encoded content में हमेशा होते हैं। ईमेल अटैचमेंट, PEM सर्टिफिकेट, और कुछ पुराने API responses Base64 आउटपुट को 76 कैरेक्टर प्रति लाइन पर रैप करते हैं। getMimeDecoder() चुपचाप लाइन सेपरेटर और Base64 अल्फाबेट में न आने वाले किसी भी कैरेक्टर को अनदेखा करता है, इसलिए यह out of the box इसे हैंडल करता है।
import java.util.Base64;
import java.nio.charset.StandardCharsets;
public class MimeDecode {
public static void main(String[] args) {
// PEM certificate body — line-wrapped at 76 characters
String pemBody = "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t\r\n"
+ "TUlJQm96Q0NBVWlnQXdJQkFnSUpBSXBhVDJU\r\n"
+ "aVFvZU1BMEdDU3FHU0liM0RRRU==";
// getDecoder() would throw IllegalArgumentException here
byte[] decoded = Base64.getMimeDecoder().decode(pemBody);
System.out.println(new String(decoded, StandardCharsets.UTF_8));
// -----BEGIN CERTIFICATE-----
// MIIBozCCAUigAwIBAgIJAIpaT2T...
}
}getMimeDecoder() उदार है: यह exception थ्रो करने की बजाय invalid कैरेक्टर को skip करता है। यह ज्ञात MIME डेटा के लिए ठीक है, लेकिन यह arbitrary इनपुट में corruption को चुपचाप निगल सकता है। कड़ी validation के लिए getDecoder() उपयोग करें।फ़ाइल और API Response से Base64 डिकोड करना
डिस्क से Base64-encoded फ़ाइल पढ़ना
Binary फ़ाइलें (images, certificates, encrypted blobs) कभी-कभी डिस्क पर Base64 टेक्स्ट के रूप में stored होती हैं। फ़ाइल पढ़ें, डिकोड करें, binary आउटपुट लिखें:
import java.util.Base64;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class DecodeFile {
public static void main(String[] args) {
Path inputPath = Path.of("tls-cert.pem.b64");
Path outputPath = Path.of("tls-cert.pem");
try {
String encoded = Files.readString(inputPath).strip();
byte[] decoded = Base64.getMimeDecoder().decode(encoded);
Files.write(outputPath, decoded);
System.out.printf("Decoded %d bytes → %s%n", decoded.length, outputPath);
} catch (IOException e) {
System.err.println("File error: " + e.getMessage());
} catch (IllegalArgumentException e) {
System.err.println("Invalid Base64: " + e.getMessage());
}
}
}HTTP API Response से Base64 फील्ड डिकोड करना
Cloud APIs (AWS KMS, GitHub Contents, Vault) अक्सर JSON के अंदर Base64 strings के रूप में binary डेटा लौटाते हैं। पहले JSON parse करें, फिर target फील्ड डिकोड करें:
import java.util.Base64;
import java.nio.charset.StandardCharsets;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class DecodeApiResponse {
public static void main(String[] args) {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/secrets/db-password"))
.header("Authorization", "Bearer sk-prod-9f8e7d6c")
.build();
try {
HttpResponse<String> response = client.send(
request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() != 200) {
System.err.printf("Unexpected status: %d%n", response.statusCode());
return;
}
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(response.body());
// API returns: {"name":"db-password","value":"cG9zdGdyZXM6eGs5...","version":3}
String encodedValue = root.get("value").asText();
byte[] decoded = Base64.getDecoder().decode(encodedValue);
String secret = new String(decoded, StandardCharsets.UTF_8);
System.out.println("Secret: " + secret);
// Secret: postgres:xk9mP2qR@db-prod:5432/orders
} catch (Exception e) {
System.err.println("Failed to fetch secret: " + e.getMessage());
}
}
}IllegalArgumentException के लिए network errors से अलग अपने try-catch में रैप करें। I/O exceptions को decoding failures के साथ मिलाने से debugging मुश्किल हो जाती है — आप तुरंत जानना चाहते हैं कि API ने खराब डेटा लौटाया या नेटवर्क विफल हुआ।कमांड लाइन से Base64 डिकोडिंग
आपको हमेशा Java प्रोग्राम की ज़रूरत नहीं होती। हर Linux और macOS सिस्टम पर एक base64 कमांड होती है, और JDK 9+ interactive Java one-liners के लिए jshell शिप करता है। debugging के दौरान त्वरित जाँच के लिए, ये class compile करने से तेज़ हैं।
# Decode a Base64 string (Linux / macOS)
echo "eyJob3N0IjoiMTAuMC4xLjUwIiwicG9ydCI6ODQ0M30=" | base64 --decode
# {"host":"10.0.1.50","port":8443}
# Decode and pretty-print with jq
echo "eyJob3N0IjoiMTAuMC4xLjUwIiwicG9ydCI6ODQ0M30=" | base64 --decode | jq .
# {
# "host": "10.0.1.50",
# "port": 8443
# }
# Quick decode with jshell (JDK 9+)
echo 'System.out.println(new String(java.util.Base64.getDecoder().decode("c2VydmVyLWNvbmZpZw==")))' | jshell -
# server-config
# macOS uses -D instead of --decode
echo "c2VydmVyLWNvbmZpZw==" | base64 -Dब्राउज़र में encoded strings सीधे paste करने के लिए, ToolDeck का Base64 decoder बिना किसी setup के standard और URL-safe दोनों वेरिएंट हैंडल करता है।
हाई-परफॉर्मेंस विकल्प: Apache Commons Codec
Java का बिल्ट-इन java.util.Base64 पहले से अच्छी तरह optimized है — JDK 11+ एन्कोडिंग और डिकोडिंग के लिए x86 पर intrinsics उपयोग करता है। अधिकांश applications के लिए, third-party library की कोई ज़रूरत नहीं है। फिर भी, Apache Commons Codec legacy codebases में लोकप्रिय है और automatic whitespace handling के साथ streaming decoding के लिए Base64InputStream प्रदान करता है।
<!-- pom.xml -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.17.0</version>
</dependency>import org.apache.commons.codec.binary.Base64;
public class CommonsCodecDecode {
public static void main(String[] args) {
// Commons Codec is more lenient — handles whitespace and line breaks
String encoded = "eyJob3N0IjoiMTAuMC4xLjUw\nIiwicG9ydCI6ODQ0M30=";
byte[] decoded = Base64.decodeBase64(encoded);
System.out.println(new String(decoded));
// {"host":"10.0.1.50","port":8443}
}
}built-in API पर Commons Codec का मुख्य लाभ default रूप से whitespace के साथ इसकी उदारता और Base64InputStream क्लास है जो Java के decoder.wrap() से पहले आई थी। यदि आप Java 8+ पर हैं, तो built-in API वह सब कुछ कवर करता है जो Commons Codec करता है। मैं Commons Codec तभी उपयोग करता हूँ जब प्रोजेक्ट पहले से उस पर निर्भर हो।
decoder.wrap() के साथ बड़ी Base64 फ़ाइलें स्ट्रीम करना
Files.readString() से 200 MB Base64 फ़ाइल लोड करके decode() कॉल करने से heap पर लगभग 350 MB allocate होता है: encoded string और decoded byte array।decoder.wrap(InputStream) ऑन-द-फ्लाई डिकोड करता है, जिससे मेमोरी उपयोग स्थिर रहता है।
import java.util.Base64;
import java.io.*;
import java.nio.file.*;
public class StreamDecode {
public static void main(String[] args) throws IOException {
Path src = Path.of("database-dump.sql.b64");
Path dst = Path.of("database-dump.sql");
try (InputStream in = Base64.getMimeDecoder().wrap(
new BufferedInputStream(Files.newInputStream(src)));
OutputStream out = new BufferedOutputStream(Files.newOutputStream(dst))) {
byte[] buffer = new byte[8192];
int bytesRead;
long total = 0;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
total += bytesRead;
}
System.out.printf("Decoded %d bytes → %s%n", total, dst);
}
}
}Java 9+ पर आप read loop को in.transferTo(out) से बदल सकते हैं — यह कम कोड में वही काम करता है। यदि फ़ाइल में लाइन ब्रेक हो सकते हैं (PEM फ़ाइलें, email exports), तो getDecoder().wrap() की जगह getMimeDecoder().wrap() उपयोग करें।
import java.util.Base64;
import java.io.*;
import java.nio.file.*;
public class StreamDecodeSimple {
public static void main(String[] args) throws IOException {
try (InputStream in = Base64.getMimeDecoder().wrap(
new BufferedInputStream(Files.newInputStream(Path.of("backup.tar.b64"))));
OutputStream out = Files.newOutputStream(Path.of("backup.tar"))) {
in.transferTo(out); // Java 9+
}
}
}getDecoder().wrap() stream में लाइन ब्रेक को सहन नहीं करता। यदि Base64 डेटा में newlines हैं (76 chars पर लाइन-रैप्ड), तो getMimeDecoder().wrap() उपयोग करें — अन्यथा stream चुपचाप corrupted आउटपुट उत्पन्न करती है या अप्रत्याशित read position पर throw करती है।Java में JWT Library के बिना Base64 JWT Payload डिकोड करना
JWT में तीन Base64url-encoded segments होते हैं, dots से अलग किए हुए। बीच वाला payload है — debugging में जिसकी सबसे ज़्यादा ज़रूरत होती है। आप jjwt या Nimbus लाए बिना इसे डिकोड कर सकते हैं। . पर split करें, दूसरे भाग को getUrlDecoder() से डिकोड करें, और resulting JSON parse करें:
import java.util.Base64;
import java.nio.charset.StandardCharsets;
public class JWTInspect {
public static String decodeJwtPayload(String token) {
String[] parts = token.split("\\.");
if (parts.length != 3) {
throw new IllegalArgumentException(
"Invalid JWT: expected 3 segments, got " + parts.length);
}
// JWT uses URL-safe Base64 without padding
byte[] payload = Base64.getUrlDecoder().decode(parts[1]);
return new String(payload, StandardCharsets.UTF_8);
}
public static void main(String[] args) {
String token = "eyJhbGciOiJSUzI1NiJ9"
+ ".eyJzdWIiOiJ1c3ItNjcyIiwiaXNzIjoiYXV0aC5leGFtcGxlLmNvbSIs"
+ "ImV4cCI6MTc0MTk1NjgwMCwicm9sZXMiOlsiYWRtaW4iLCJiaWxsaW5nIl19"
+ ".SIGNATURE_PLACEHOLDER";
String payload = decodeJwtPayload(token);
System.out.println(payload);
// {"sub":"usr-672","iss":"auth.example.com",
// "exp":1741956800,"roles":["admin","billing"]}
}
}सामान्य गलतियाँ
मैंने code reviews में इनमें से हर एक का सामना किया है, और पहली दो Java services में Base64-related production bugs के ज़्यादातर cases के पीछे होती हैं।
समस्या: JWT टोकन और OAuth access tokens URL-safe अल्फाबेट (- और _) उपयोग करते हैं। उन्हें getDecoder() को पास करने पर IllegalArgumentException थ्रो होता है क्योंकि - स्टैंडर्ड Base64 अल्फाबेट में नहीं है।
समाधान: अपना डेटा source जाँचें: auth systems के टोकन के लिए getUrlDecoder() चाहिए; MIME attachments के लिए getMimeDecoder() चाहिए।
// JWT header — URL-safe, no padding String header = "eyJhbGciOiJSUzI1NiJ9"; byte[] decoded = Base64.getDecoder().decode(header); // IllegalArgumentException: Illegal base64 character 2d
String header = "eyJhbGciOiJSUzI1NiJ9";
byte[] decoded = Base64.getUrlDecoder().decode(header);
System.out.println(new String(decoded));
// {"alg":"RS256"}समस्या: new String(bytes) JVM की default charset उपयोग करता है, जो environments के बीच अलग होती है। Linux CI सर्वर (UTF-8) और Windows production host (Cp1252) समान bytes के लिए अलग परिणाम देते हैं।
समाधान: हमेशा second argument के रूप में StandardCharsets.UTF_8 पास करें।
byte[] decoded = Base64.getDecoder().decode(encoded); String result = new String(decoded); // platform-dependent — may corrupt multi-byte characters
byte[] decoded = Base64.getDecoder().decode(encoded); String result = new String(decoded, StandardCharsets.UTF_8); // consistent across all platforms
समस्या: terminals से paste की गई या config फ़ाइलों से पढ़ी गई Base64 strings में अक्सर ट्रेलिंग newlines होते हैं। बेसिक डिकोडर Base64 अल्फाबेट के बाहर किसी भी कैरेक्टर को अस्वीकार करता है।
समाधान: डिकोड करने से पहले इनपुट पर .strip() कॉल करें, या getMimeDecoder() पर स्विच करें जो whitespace अनदेखा करता है।
// Read from environment variable — has a trailing newline
String encoded = System.getenv("DB_PASSWORD_B64"); // "cG9zdGdyZXM=
"
byte[] decoded = Base64.getDecoder().decode(encoded);
// IllegalArgumentException: Illegal base64 character aString encoded = System.getenv("DB_PASSWORD_B64");
byte[] decoded = Base64.getDecoder().decode(encoded.strip());
System.out.println(new String(decoded, StandardCharsets.UTF_8));
// postgresसमस्या: binary content (images, protobuf, encrypted blobs) पर new String(decoded) कॉल करने से invalid String बनती है। बाद में इसे bytes में वापस बदलने पर डेटा चुपचाप corrupt हो जाता है क्योंकि String constructor invalid UTF-8 sequences को replace करता है।
समाधान: पूरे pipeline में binary डेटा को byte[] के रूप में रखें। String में तभी बदलें जब आप जानते हों कि content टेक्स्ट है।
byte[] decoded = Base64.getDecoder().decode(pngBase64);
String imageStr = new String(decoded); // corrupts binary
Files.writeString(Path.of("image.png"), imageStr); // broken filebyte[] decoded = Base64.getDecoder().decode(pngBase64);
// Write bytes directly — no String conversion
Files.write(Path.of("image.png"), decoded);मेथड तुलना
बिल्ट-इन decoders अधिकांश use cases कवर करते हैं। Apache Commons Codec और Guava विकल्प हैं जो आपको पुराने codebases में मिल सकते हैं।
JWT टोकन और modern API payloads के लिए: getUrlDecoder()। ईमेल attachments और PEM certificates के लिए: getMimeDecoder()। बड़ी फ़ाइलों जहाँ memory मायने रखती है: decoder.wrap(InputStream)। बाकी सब: getDecoder()। Apache Commons Codec तभी समझ में आता है जब वह पहले से आपकी dependency tree में हो।
development के दौरान त्वरित सत्यापन के लिए, ऑनलाइन Base64 decoder one-off class लिखने से तेज़ है।
अक्सर पूछे जाने वाले प्रश्न
Java में Base64 स्ट्रिंग को कैसे डिकोड करें?
java.util.Base64 इम्पोर्ट करें और Base64.getDecoder().decode(encodedString) कॉल करें। यह byte[] लौटाता है — पठनीय टेक्स्ट पाने के लिए इसे new String(bytes, StandardCharsets.UTF_8) में रैप करें। URL-safe Base64 (JWT में उपयोग होता है) के लिए getDecoder() की जगह getUrlDecoder() उपयोग करें।
import java.util.Base64;
import java.nio.charset.StandardCharsets;
byte[] decoded = Base64.getDecoder().decode("c2VydmVyLWNvbmZpZw==");
String result = new String(decoded, StandardCharsets.UTF_8);
System.out.println(result); // server-configJava में getDecoder() और getMimeDecoder() में क्या अंतर है?
getDecoder() कड़ा है — यह Base64 अल्फाबेट के बाहर किसी भी कैरेक्टर को, जिसमें लाइन ब्रेक भी शामिल हैं, अस्वीकार कर देता है। getMimeDecoder() लाइन सेपरेटर (\r\n) को सहन करता है और गैर-Base64 कैरेक्टर को अनदेखा करता है, जिससे यह ईमेल अटैचमेंट और PEM सर्टिफिकेट डिकोड करने के लिए सही विकल्प है जहाँ डेटा 76 कैरेक्टर पर लाइन-रैप्ड होता है।
String wrapped = "c2VydmVyLWNv\r\nbmZpZw=="; // getDecoder() throws IllegalArgumentException // Base64.getDecoder().decode(wrapped); // FAILS // getMimeDecoder() handles it byte[] decoded = Base64.getMimeDecoder().decode(wrapped); System.out.println(new String(decoded)); // server-config
Java में Base64 URL-safe स्ट्रिंग को कैसे डिकोड करें?
Base64.getUrlDecoder().decode(encoded) उपयोग करें। URL डिकोडर RFC 4648 §5 में परिभाषित - और _ अल्फाबेट की अपेक्षा करता है, न कि + और /। JWT टोकन हमेशा इसी अल्फाबेट का उपयोग करते हैं। यदि पैडिंग कैरेक्टर (=) हटा दिए गए हों (JWT में सामान्य), तो URL डिकोडर फिर भी इसे हैंडल करता है — Java का URL डिकोडर पैडेड और अनपैडेड दोनों इनपुट स्वीकार करता है।
import java.util.Base64;
// JWT header — URL-safe, no padding
String jwtHeader = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9";
byte[] decoded = Base64.getUrlDecoder().decode(jwtHeader);
System.out.println(new String(decoded));
// {"alg":"HS256","typ":"JWT"}Java में बड़ी Base64 फ़ाइल को स्ट्रीम-डिकोड कैसे करें?
FileInputStream को रैप करने के लिए decoder.wrap(inputStream) उपयोग करें। लौटाई गई InputStream bytes पढ़ते समय Base64 को ऑन-द-फ्लाई डिकोड करती है, इसलिए फ़ाइल के आकार के बावजूद मेमोरी उपयोग स्थिर रहता है। बेहतर थ्रूपुट के लिए इसे BufferedInputStream के ज़रिए या सीधे Files.copy() से जोड़ें।
import java.util.Base64;
import java.io.*;
import java.nio.file.*;
try (InputStream in = Base64.getDecoder().wrap(
new BufferedInputStream(new FileInputStream("payload.b64")));
OutputStream out = new FileOutputStream("payload.bin")) {
in.transferTo(out);
}Base64.getDecoder().decode() IllegalArgumentException क्यों थ्रो करता है?
बेसिक डिकोडर कड़ा है: यह लाइन ब्रेक, स्पेस और A-Za-z0-9+/= के बाहर किसी भी कैरेक्टर को अस्वीकार करता है। तीन सामान्य कारण: इनपुट में ट्रेलिंग न्यूलाइन है (इसे trim करें), इनपुट URL-safe कैरेक्टर जैसे - और _ उपयोग करता है (getUrlDecoder() पर स्विच करें), या इनपुट 76 कैरेक्टर पर लाइन-रैप्ड है (getMimeDecoder() पर स्विच करें)। यदि error मैसेज अस्पष्ट हो तो हमेशा raw bytes जाँचें।
String raw = "c2VydmVyLWNvbmZpZw==\n"; // trailing newline // Option 1: trim whitespace byte[] decoded = Base64.getDecoder().decode(raw.strip()); // Option 2: use MIME decoder which ignores whitespace byte[] decoded2 = Base64.getMimeDecoder().decode(raw);
क्या Java में java.util.Base64 के बिना Base64 डिकोड किया जा सकता है?
हाँ, लेकिन Java 8+ पर ऐसा करने का कोई अच्छा कारण नहीं है। Java 8 से पहले, डेवलपर sun.misc.BASE64Decoder (इंटरनल, Java 9+ में हटाया गया), javax.xml.bind.DatatypeConverter.parseBase64Binary() (Java 11 में हटाया गया), या Apache Commons Codec उपयोग करते थे। तीनों या तो deprecated हैं या अतिरिक्त dependency की आवश्यकता है। java.util.Base64 से ही काम करें — यह तेज़ है, JDK के साथ आता है, और तीनों वेरिएंट (basic, URL-safe, MIME) को कवर करता है।
संबंधित टूल
- Base64 एन्कोडर — ब्राउज़र में टेक्स्ट या binary डेटा को Base64 में encode करें, Java unit tests में paste करने के लिए test fixtures generate करने में उपयोगी।
- JWT डिकोडर — तीनों JWT segments को एक साथ split और decode करें, field-by-field payload inspection के साथ — जब आपको सिर्फ टोकन पढ़ना हो तो Java class लिखने से तेज़।
- URL डिकोड — URL-encoded strings को percent-decode करें, तब उपयोगी जब API responses में Base64url डेटा percent-encoded query parameters के साथ मिला हो।
- JSON फ़ॉर्मेटर — Base64 JWT payload या API config decode करने के बाद, JSON यहाँ paste करें pretty-print और structure validate करने के लिए।