Java में Base64 Decode — getDecoder().decode() गाइड

·Backend Engineer·समीक्षकAisha Osei·प्रकाशित

मुफ़्त Base64 Decode Online को सीधे अपने ब्राउज़र में उपयोग करें — इंस्टॉलेशन की ज़रूरत नहीं।

Base64 Decode Online ऑनलाइन आज़माएं →

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 करना।

Before · text
After · text
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

Java 8+
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

Java 8+
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 से बचाता है:

Java 8+
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

Java 8+
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 ऑब्जेक्ट

Java 8+
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
    }
}
चेतावनी:अविश्वसनीय Base64 डेटा को deserialize करने के लिए कभी 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 पर होते हैं।

Method
रिटर्न टाइप
इनपुट टाइप
विवरण
getDecoder()
Base64.Decoder
स्टैंडर्ड डिकोडर (RFC 4648 §4, + और / अल्फाबेट, = पैडिंग के साथ)
getUrlDecoder()
Base64.Decoder
URL-safe डिकोडर (RFC 4648 §5, - और _ अल्फाबेट, = पैडिंग के साथ)
getMimeDecoder()
Base64.Decoder
MIME डिकोडर — लाइन सेपरेटर और गैर-Base64 कैरेक्टर को अनदेखा करता है
decode(String src)
byte[]
String
इनपुट स्ट्रिंग को नए byte array में डिकोड करता है
decode(byte[] src)
byte[]
byte[]
इनपुट byte array को नए byte array में डिकोड करता है
decode(byte[] src, byte[] dst)
int
byte[] + byte[]
पहले से आवंटित dst बफर में डिकोड करता है, लिखे गए bytes की संख्या लौटाता है
wrap(InputStream is)
InputStream
InputStream
एक ऐसी stream लौटाता है जो Base64 डेटा को रीड करते समय डिकोड करती है

getMimeDecoder() — लाइन-रैप्ड और MIME Base64 डिकोडिंग

बेसिक डिकोडर Base64 अल्फाबेट के बाहर किसी भी चीज़ को अस्वीकार करता है — और इसमें वे \r\n लाइन ब्रेक भी शामिल हैं जो MIME-encoded content में हमेशा होते हैं। ईमेल अटैचमेंट, PEM सर्टिफिकेट, और कुछ पुराने API responses Base64 आउटपुट को 76 कैरेक्टर प्रति लाइन पर रैप करते हैं। getMimeDecoder() चुपचाप लाइन सेपरेटर और Base64 अल्फाबेट में न आने वाले किसी भी कैरेक्टर को अनदेखा करता है, इसलिए यह out of the box इसे हैंडल करता है।

Java 8+
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 आउटपुट लिखें:

Java 8+
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 फील्ड डिकोड करें:

Java 11+
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());
        }
    }
}
नोट:decode कॉल को 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 करने से तेज़ हैं।

bash
# 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 प्रदान करता है।

XML (Maven)
<!-- pom.xml -->
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.17.0</version>
</dependency>
Java 8+
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) ऑन-द-फ्लाई डिकोड करता है, जिससे मेमोरी उपयोग स्थिर रहता है।

Java 8+
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() उपयोग करें।

Java 9+
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 करें:

Java 8+
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 के पीछे होती हैं।

URL-safe इनपुट पर getDecoder() उपयोग करना

समस्या: JWT टोकन और OAuth access tokens URL-safe अल्फाबेट (- और _) उपयोग करते हैं। उन्हें getDecoder() को पास करने पर IllegalArgumentException थ्रो होता है क्योंकि - स्टैंडर्ड Base64 अल्फाबेट में नहीं है।

समाधान: अपना डेटा source जाँचें: auth systems के टोकन के लिए getUrlDecoder() चाहिए; MIME attachments के लिए getMimeDecoder() चाहिए।

Before · Java
After · Java
// 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"}
String बनाते समय charset निर्दिष्ट न करना

समस्या: new String(bytes) JVM की default charset उपयोग करता है, जो environments के बीच अलग होती है। Linux CI सर्वर (UTF-8) और Windows production host (Cp1252) समान bytes के लिए अलग परिणाम देते हैं।

समाधान: हमेशा second argument के रूप में StandardCharsets.UTF_8 पास करें।

Before · Java
After · Java
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 अनदेखा करता है।

Before · Java
After · Java
// 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 a
String encoded = System.getenv("DB_PASSWORD_B64");
byte[] decoded = Base64.getDecoder().decode(encoded.strip());
System.out.println(new String(decoded, StandardCharsets.UTF_8));
// postgres
Binary डेटा को String में बदलना

समस्या: 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 टेक्स्ट है।

Before · Java
After · Java
byte[] decoded = Base64.getDecoder().decode(pngBase64);
String imageStr = new String(decoded); // corrupts binary
Files.writeString(Path.of("image.png"), imageStr); // broken file
byte[] 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 में मिल सकते हैं।

Method
एन्कोडिंग वेरिएंट
व्हाइटस्पेस अनदेखा
स्ट्रीमिंग
कस्टम टाइप
इंस्टॉल आवश्यक
Base64.getDecoder()
Standard (+, /)
नहीं (JDK 8+)
Base64.getUrlDecoder()
URL-safe (-, _)
नहीं (JDK 8+)
Base64.getMimeDecoder()
MIME (लाइन ब्रेक ठीक)
नहीं (JDK 8+)
decoder.wrap(InputStream)
कोई भी वेरिएंट
डिकोडर पर निर्भर
नहीं (JDK 8+)
Apache Commons Base64InputStream
Standard / URL-safe
हाँ (commons-codec)
Apache Commons Base64.decodeBase64()
Standard
हाँ (commons-codec)
Guava BaseEncoding.base64().decode()
Standard
हाँ (guava)

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() उपयोग करें।

Java 8+
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-config

Java में getDecoder() और getMimeDecoder() में क्या अंतर है?

getDecoder() कड़ा है — यह Base64 अल्फाबेट के बाहर किसी भी कैरेक्टर को, जिसमें लाइन ब्रेक भी शामिल हैं, अस्वीकार कर देता है। getMimeDecoder() लाइन सेपरेटर (\r\n) को सहन करता है और गैर-Base64 कैरेक्टर को अनदेखा करता है, जिससे यह ईमेल अटैचमेंट और PEM सर्टिफिकेट डिकोड करने के लिए सही विकल्प है जहाँ डेटा 76 कैरेक्टर पर लाइन-रैप्ड होता है।

Java 8+
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 डिकोडर पैडेड और अनपैडेड दोनों इनपुट स्वीकार करता है।

Java 8+
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() से जोड़ें।

Java 8+
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 जाँचें।

Java 8+
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 करने के लिए।
इसमें भी उपलब्ध:JavaScriptPythonGoC#
PN
Pavel NovakBackend Engineer

Pavel is a backend engineer with deep roots in the JVM ecosystem, working primarily with Java and Kotlin. He has extensive experience building data-intensive services and integrating third-party APIs at scale. He writes about modern Java features, the Jackson ecosystem, serialisation patterns, and practical approaches to keeping large codebases maintainable.

AO
Aisha Oseiतकनीकी समीक्षक

Aisha is a Java engineer specialising in application security, Spring Security, and API design. She has worked on identity and access management systems, OAuth 2.0 integrations, and microservice security at scale. She writes about secure Java coding practices, token validation, cryptographic utilities, and the Spring ecosystem from a security-first perspective.