ToolDeck

C#-এ Base64 ডিকোড — Convert.FromBase64String() গাইড

·Game Developer & Unity Engineer·পর্যালোচনা করেছেনEmma Richardson·প্রকাশিত

বিনামূল্যে অনলাইন Base64 ডিকোড অনলাইন সরাসরি আপনার ব্রাউজারে ব্যবহার করুন — ইনস্টলের প্রয়োজন নেই।

Base64 ডিকোড অনলাইন অনলাইনে ব্যবহার করুন →

আমি যতগুলো .NET প্রজেক্টে কাজ করেছি, প্রায় সবগুলোতেই কোনো না কোনো সময় Base64 ডিকোড করার দরকার পড়েছে — Kubernetes secret থেকে connection string বের করা, webhook থেকে binary payload পড়া, বা debugging session-এ JWT টোকেন পরীক্ষা করা। C#-এ Base64 ডিকোড করার প্রধান মেথড হলো Convert.FromBase64String(), যা একটি byte[] রিটার্ন করে, তারপর সেটি Encoding.UTF8.GetString()-এ পাস করলে পাঠযোগ্য টেক্সট পাওয়া যায়। কোড না লিখে দ্রুত পরীক্ষার জন্য, ToolDeck-এর Base64 decoder ব্রাউজারে সঙ্গে সঙ্গে কাজ করে। এই গাইডে Convert.FromBase64String(), .NET 5+-এর জন্য span-ভিত্তিক TryFromBase64String(), উচ্চ-কার্যক্ষমতার System.Buffers.Text.Base64 API, JWT payload extraction, ফাইল ও API response ডিকোডিং, CryptoStream দিয়ে streaming, এবং C# ডেভেলপারদের সবচেয়ে বেশি ভুল করার চারটি জায়গা আলোচনা করা হয়েছে।

  • Convert.FromBase64String(s) + Encoding.UTF8.GetString(bytes) হলো স্ট্যান্ডার্ড দুই-ধাপের pipeline — সব .NET সংস্করণে কাজ করে।
  • Convert.TryFromBase64String() অবৈধ ইনপুটে exception এড়িয়ে Span<byte>-এ ফলাফল লেখে — .NET 5+-এর hot path-এর জন্য আদর্শ।
  • System.Buffers.Text.Base64.DecodeFromUtf8() performance-critical সার্ভিসে UTF-8 byte buffer-এর জন্য zero-allocation ডিকোডিং দেয়।
  • JWT টোকেন Base64url ব্যবহার করে (+ এবং / এর বদলে - এবং _) — Convert.FromBase64String() কল করার আগে ইনপুট normalize করতে হবে।
  • CryptoStream সহ FromBase64Transform বড় ফাইলের জন্য streaming ডিকোডিং হ্যান্ডল করে সব মেমরিতে না লোড করেই।

Base64 ডিকোডিং কী?

Base64 এনকোডিং binary ডেটাকে 64-চরিত্রের ASCII alphabet-এ রূপান্তর করে যাতে text-only transport-এ টিকে থাকে — JSON field, HTTP header, email body, XML attribute। ইনপুটের প্রতি 3 byte থেকে 4টি Base64 চরিত্র তৈরি হয়, তাই Base64 আউটপুট সবসময় মূলের তুলনায় প্রায় 33% বড়। ডিকোডিং এই রূপান্তর উল্টে দেয়। শেষে = padding ডিকোডারকে জানায় শেষ গ্রুপ থেকে কত byte ছাঁটতে হবে। একটি = মানে শেষ block-এ 2 byte ছিল; == মানে 1 byte ছিল। Base64 এনক্রিপশন নয় — যে কেউ এটি উল্টাতে পারে। উদ্দেশ্য হলো text-only channel-এ binary ডেটা নিরাপদে পাঠানো, গোপনীয়তা নয়।

Before · text
After · text
cmVkaXM6Ly9jYWNoZS1wcm9kLmludGVybmFsOjYzNzkvc2Vzc2lvbi1zdG9yZQ==
redis://cache-prod.internal:6379/session-store

Convert.FromBase64String() — স্ট্যান্ডার্ড ডিকোডিং মেথড

Convert.FromBase64String() মেথডটি .NET Framework 1.1 থেকে আছে। কোনো NuGet package নেই, System-এর বাইরে কোনো extra import নেই — শুধু কল করুন এবং একটি byte[] ফিরে পান। Base64 থেকে C# string ডিকোড করার দুই-ধাপের pipeline সবসময় একই: bytes পেতে Convert.FromBase64String(), তারপর সেই bytes-কে text হিসেবে interpret করতে Encoding.UTF8.GetString()। সমস্যা হলো মেথডটি raw bytes রিটার্ন করে, string নয়। সেই bytes থেকে text-এ ফিরতে সঠিক Encoding বেছে নিতে হবে, এবং পছন্দটি অনেকের ধারণার চেয়ে বেশি গুরুত্বপূর্ণ। ভুল encoding নীরবে mojibake তৈরি করে — কোনো exception ছাড়াই বিকৃত চরিত্র।

ন্যূনতম কার্যকরী উদাহরণ

C# (.NET 6+)
using System;
using System.Text;

// Kubernetes secret-এ Base64 হিসেবে সংরক্ষিত Connection string
string encoded = "cmVkaXM6Ly9jYWNoZS1wcm9kLmludGVybmFsOjYzNzkvc2Vzc2lvbi1zdG9yZQ==";

byte[] decodedBytes = Convert.FromBase64String(encoded);
string connectionString = Encoding.UTF8.GetString(decodedBytes);

Console.WriteLine(connectionString);
// redis://cache-prod.internal:6379/session-store

বিশেষ কারণ না থাকলে সবসময় Encoding.UTF8 ব্যবহার করুন। .NET runtime আভ্যন্তরীণভাবে string-কে UTF-16 হিসেবে প্রতিনিধিত্ব করে, কিন্তু system boundary অতিক্রম করা বেশিরভাগ ডেটা (API response, config file, secret) UTF-8 এনকোড করা। মাল্টি-বাইট চরিত্র সহ ডেটায় Encoding.ASCII ব্যবহার করলে নীরবে সেগুলো ? দিয়ে প্রতিস্থাপিত হয় — কোনো exception নেই, শুধু বিকৃত আউটপুট।

Round-trip যাচাই

C# (.NET 6+)
using System;
using System.Text;

string original = "postgres://db-admin:Kx8!mQ@db-prod.us-east-1.internal:5432/orders";

// এনকোড করুন
string encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(original));
Console.WriteLine(encoded);
// cG9zdGdyZXM6Ly9kYi1hZG1pbjpLeDghbVFAZGItcHJvZC51cy1lYXN0LTEuaW50ZXJuYWw6NTQzMi9vcmRlcnM=

// ডিকোড করুন
byte[] decoded = Convert.FromBase64String(encoded);
string recovered = Encoding.UTF8.GetString(decoded);

Console.WriteLine(recovered == original); // True

সঠিক Encoding বেছে নেওয়া

GetString()-এ যে Encoding পাস করবেন তা অবশ্যই ডেটা মূলে এনকোড করার সময় ব্যবহৃত encoding-এর সাথে মিলতে হবে। ভুলটি বেছে নিলে কোনো exception ছাড়াই garbage চরিত্র পাবেন — decoder নির্বিঘ্নে অর্থহীন আউটপুট তৈরি করে। এখানে ব্যবহারিক ব্যাখ্যা:

  • Encoding.UTF8 — নিরাপদ ডিফল্ট। ASCII এবং সব Unicode হ্যান্ডল করে। অন্যথায় না জানলে এটি ব্যবহার করুন।
  • Encoding.ASCII — শুধুমাত্র pure 7-bit ASCII ডেটার জন্য। মাল্টি-বাইট চরিত্র ? হয়ে যায়।
  • Encoding.Unicode — এটি .NET-এ UTF-16LE। কিছু Windows-internal string এবং PowerShell export এটি ব্যবহার করে।
  • Encoding.Latin1 — legacy পশ্চিম ইউরোপীয় encoding। পুরনো SOAP সার্ভিস এবং mainframe integration-এ দেখা যায়।
C# (.NET 6+)
using System;
using System.Text;

// একই bytes, ভিন্ন encoding — ভিন্ন ফলাফল
byte[] decoded = Convert.FromBase64String("w7bDvMOk");

Console.WriteLine(Encoding.UTF8.GetString(decoded));    // öüä  (সঠিক)
Console.WriteLine(Encoding.ASCII.GetString(decoded));   // ??????  (হারিয়ে গেছে)
Console.WriteLine(Encoding.Latin1.GetString(decoded));  // öüä  (mojibake)

error handling সহ পুনর্ব্যবহারযোগ্য decode helper

যেহেতু Convert.FromBase64String() খারাপ ইনপুটে exception throw করে এবং whitespace-stripping বারবার করতে হয়, তাই বেশিরভাগ প্রজেক্টে আমি একটি ছোট helper রাখি:

C# (.NET 6+)
using System;
using System.Text;

static class Base64Helper
{
    public static string? DecodeToString(string encoded)
    {
        if (string.IsNullOrWhiteSpace(encoded))
            return null;

        // .NET-এর decoder যে whitespace প্রত্যাখ্যান করে তা মুছুন
        string cleaned = encoded
            .Replace("
", "")
            .Replace("
", "")
            .Replace(" ", "")
            .Trim();

        try
        {
            byte[] bytes = Convert.FromBase64String(cleaned);
            return Encoding.UTF8.GetString(bytes);
        }
        catch (FormatException)
        {
            return null; // বা domain-specific exception ছুঁড়ুন
        }
    }
}

// ব্যবহার
string? decoded = Base64Helper.DecodeToString("  cmVkaXM6Ly9jYWNoZQ==  \n");
Console.WriteLine(decoded); // redis://cache
নোট:Convert.FromBase64String() Base64 alphabet-এর বাইরের চরিত্র থাকলেFormatException throw করে — space, newline, এবং - _-এর মতো URL-safe চরিত্র সহ। উপরের helper whitespace স্বয়ংক্রিয়ভাবে হ্যান্ডল করে।

Non-Standard টাইপে Base64 ডিকোডিং

ডিকোডার সবসময় byte[] দেয়। সেই bytes দিয়ে কী করবেন তা মূল ডেটার উপর নির্ভর করে। কখনো এটি 16 raw byte হিসেবে সংরক্ষিত GUID, কখনো serialized protobuf message, কখনো binary format-এ timestamp। এখানে আমি সবচেয়ে বেশি যে conversion ব্যবহার করি:

Base64 থেকে GUID

C# (.NET 6+)
using System;

// কিছু API 36-char hex string-এর বদলে 22-char Base64 হিসেবে GUID পাঠায়
string compactGuid = "C0HqetxMckKlZw4CssPUeQ==";
byte[] guidBytes = Convert.FromBase64String(compactGuid);
Guid recovered = new Guid(guidBytes);

Console.WriteLine(recovered);
// 7aea41c0-4cdc-4272-a567-0e02b2c3d479

System.Text.Json দিয়ে Base64 থেকে deserialized JSON

C# (.NET 6+)
using System;
using System.Text;
using System.Text.Json;

// message queue থেকে Base64-encoded JSON payload
string encoded = "eyJzZXJ2aWNlIjoicGF5bWVudC1nYXRld2F5IiwicmVnaW9uIjoiZXUtd2VzdC0xIiwicmVwbGljYXMiOjR9";

byte[] jsonBytes = Convert.FromBase64String(encoded);
string json = Encoding.UTF8.GetString(jsonBytes);
Console.WriteLine(json);
// {"service":"payment-gateway","region":"eu-west-1","replicas":4}

// একটি record-এ deserialize করুন
var deployEvent = JsonSerializer.Deserialize<DeployEvent>(jsonBytes);
Console.WriteLine($"{deployEvent!.Service} in {deployEvent.Region}");
// payment-gateway in eu-west-1

record DeployEvent(string Service, string Region, int Replicas);

Base64 থেকে hex string

C# (.NET 5+)
using System;

// Base64 হিসেবে সংরক্ষিত SHA-256 hash
string hashBase64 = "n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg=";
byte[] hashBytes = Convert.FromBase64String(hashBase64);
string hex = Convert.ToHexString(hashBytes);

Console.WriteLine(hex);
// 9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08
সতর্কতা:BinaryFormatter ব্যবহার করে অবিশ্বস্ত Base64 ডেটা কখনো deserialize করবেন না। এতে remote code execution vulnerability আছে এবং এটি .NET 8+-এ obsolete। এনকোড করা কন্টেন্ট বাইরের উৎস থেকে আসলে .NET binary serialization-এর বদলে JSON বা protobuf হিসেবে parse করুন।

Base64 ডিকোডিং মেথড রেফারেন্স

.NET দুটি namespace জুড়ে একাধিক ডিকোডিং মেথড প্রদান করে। Convert class সাধারণ-উদ্দেশ্যের ডিকোডিং হ্যান্ডল করে, আর System.Buffers.Text.Base64 উচ্চ-থ্রুপুট পরিস্থিতির জন্য যেখানে আপনি ইতিমধ্যে raw UTF-8 byte buffer নিয়ে কাজ করছেন।

মেথড
রিটার্ন
ইনপুট টাইপ
বিবরণ
Convert.FromBase64String(string)
byte[]
string
স্ট্যান্ডার্ড Base64 স্ট্রিং থেকে byte array ডিকোড করে; অবৈধ ইনপুটে FormatException throw করে
Convert.TryFromBase64String(string, Span<byte>, out int)
bool
string + Span<byte>
caller-allocated Span-এ ডিকোড করার চেষ্টা করে; ব্যর্থ হলে false রিটার্ন করে exception throw করে না (.NET 5+)
Convert.FromBase64CharArray(char[], int, int)
byte[]
char[] + offset + length
char array-এর একটি অংশ ডিকোড করে; substring তৈরি না করে buffer পার্স করতে উপকারী
Convert.TryFromBase64Chars(ReadOnlySpan<char>, Span<byte>, out int)
bool
ReadOnlySpan<char> + Span<byte>
char span থেকে Span-ভিত্তিক, zero-allocation ডিকোডিং (.NET 5+)
System.Buffers.Text.Base64.DecodeFromUtf8(ROSpan<byte>, Span<byte>, out int, out int, bool)
OperationStatus
ReadOnlySpan<byte> + Span<byte>
উচ্চ-কার্যক্ষমতার UTF-8 byte ডিকোডিং; OperationStatus enum রিটার্ন করে (.NET Core 2.1+)
System.Buffers.Text.Base64.DecodeFromUtf8InPlace(Span<byte>, out int)
OperationStatus
Span<byte>
ইনপুট buffer ওভাররাইট করে in-place ডিকোড; zero extra allocation (.NET Core 2.1+)

Convert.TryFromBase64String() — Exception-মুক্ত ডিকোডিং

Try pattern .NET-এ user input-এ ব্যর্থ হতে পারে এমন অপারেশনের জন্য স্ট্যান্ডার্ড। Convert.TryFromBase64String(), .NET 5 থেকে উপলব্ধ, FormatException throw না করে একটি bool রিটার্ন করে। এটি ডিকোড করা bytes caller-provided Span<byte>-এ লেখে, যার মানে ছোট payload-এর জন্য stack-allocated মেমরি ব্যবহার করতে পারবেন এবং heap সম্পূর্ণ এড়িয়ে যেতে পারবেন।

C# (.NET 5+)
using System;
using System.Text;

string userInput = "eyJob3N0IjoiMTAuMC4xLjUwIiwicG9ydCI6ODQ0M30=";

// ছোট payload-এর জন্য Stack-allocate করুন (< 1KB একটি নিরাপদ নিয়ম)
Span<byte> buffer = stackalloc byte[256];

if (Convert.TryFromBase64String(userInput, buffer, out int bytesWritten))
{
    string result = Encoding.UTF8.GetString(buffer[..bytesWritten]);
    Console.WriteLine(result);
    // {"host":"10.0.1.50","port":8443}
}
else
{
    Console.WriteLine("Invalid Base64 input — skipping");
}

এই পদ্ধতিটা request middleware বা validation pipeline-এ বেশি কাজে আসে যেখানে খারাপ ইনপুট প্রত্যাশিত, exceptional নয়। প্রতিটি malformed request-এFormatException throw ও catch করা scale-এ measurable overhead যোগ করে —TryFromBase64String() এটি সম্পূর্ণ এড়িয়ে যায়।

ডিকোড না করে Base64 ইনপুট যাচাই করা

API controller-এ একটি সাধারণ pattern: downstream-এ পাঠানোর আগে ইনপুট valid Base64 কিনা পরীক্ষা করুন। একটি throwaway buffer allocate করে TryFromBase64String()validator হিসেবে ব্যবহার করতে পারবেন:

C# (.NET 5+)
using System;

static bool IsValidBase64(string input)
{
    // সর্বোচ্চ decoded size গণনা করুন
    Span<byte> buffer = stackalloc byte[((input.Length + 3) / 4) * 3];
    return Convert.TryFromBase64String(input, buffer, out _);
}

// API controller-এ ব্যবহার
Console.WriteLine(IsValidBase64("eyJob3N0IjoiMTAuMC4xLjUwIn0=")); // True
Console.WriteLine(IsValidBase64("not!!valid!!base64"));              // False
Console.WriteLine(IsValidBase64(""));                                // True (empty valid)
নোট:output buffer যথেষ্ট বড় হতে হবে। খুব ছোট হলে TryFromBase64String() false রিটার্ন করে এমনকি ইনপুট valid হলেও। নিরাপদ থাকতে required size (inputLength / 4) * 3 হিসেবে গণনা করুন।

ফাইল এবং API Response থেকে Base64 ডিকোড

ডিস্ক থেকে Base64-encoded ফাইল পড়া

Certificate, encrypted blob, এবং data export ফাইল কখনো কখনো Base64 text হিসেবে আসে। সাধারণ pattern: ফাইলটি string হিসেবে পড়ুন, FormatException ঘটাতে পারে এমন whitespace বা line break মুছুন, bytes-এ ডিকোড করুন, এবং binary আউটপুট লিখুন। error handling-এ মনোযোগ দিন — file I/O error এবং Base64 format error আলাদাভাবে ধরা উচিত।

C# (.NET 6+)
using System;
using System.IO;

string inputPath = "tls-cert.pem.b64";
string outputPath = "tls-cert.pem";

try
{
    string encoded = File.ReadAllText(inputPath).Trim();
    // Line break মুছুন — .NET-এর decoder সেগুলো প্রত্যাখ্যান করে
    encoded = encoded.Replace("
", "").Replace("
", "");

    byte[] decoded = Convert.FromBase64String(encoded);
    File.WriteAllBytes(outputPath, decoded);

    Console.WriteLine($"Decoded {decoded.Length} bytes -> {outputPath}");
}
catch (IOException ex)
{
    Console.Error.WriteLine($"File error: {ex.Message}");
}
catch (FormatException ex)
{
    Console.Error.WriteLine($"Invalid Base64: {ex.Message}");
}

HTTP API response থেকে Base64 field ডিকোড করা

Cloud API (Azure Key Vault, AWS Secrets Manager, GitHub Contents API) প্রায়ই JSON-এর মধ্যে Base64 string হিসেবে binary ডেটা রিটার্ন করে। workflow সবসময় একই: HTTP request করুন, JSON response parse করুন, Base64 field বের করুন, এবং ডিকোড করুন। নিচের উদাহরণ HttpClient এবং System.Text.Json ব্যবহার করে — উভয়ই .NET 6+-এ built-in।

C# (.NET 6+)
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer sk-prod-9f8e7d6c");

try
{
    var response = await client.GetAsync("https://api.example.com/secrets/db-password");
    response.EnsureSuccessStatusCode();

    string body = await response.Content.ReadAsStringAsync();

    // API রিটার্ন করে: {"name":"db-password","value":"cG9zdGdyZXM6eGs5bVAycVI=","version":3}
    using var doc = JsonDocument.Parse(body);
    string encodedValue = doc.RootElement.GetProperty("value").GetString()!;

    byte[] decoded = Convert.FromBase64String(encodedValue);
    string secret = Encoding.UTF8.GetString(decoded);

    Console.WriteLine($"Secret: {secret}");
    // Secret: postgres:xk9mP2qR
}
catch (HttpRequestException ex)
{
    Console.Error.WriteLine($"HTTP error: {ex.Message}");
}
catch (FormatException ex)
{
    Console.Error.WriteLine($"Base64 decode failed: {ex.Message}");
}
নোট:network error এবং FormatException-এর জন্য আলাদা catch block রাখুন। একসাথে মেশালে বোঝা কঠিন হয় API খারাপ ডেটা রিটার্ন করেছে নাকি request ব্যর্থ হয়েছে। Production-এ FormatException ধরলে raw Base64 value (বা অন্তত তার দৈর্ঘ্য এবং প্রথম 20 চরিত্র) log করুন — এটি debugging অনেক সহজ করে।

Command Line থেকে Base64 ডিকোডিং

সবসময় compiled project দরকার নেই। dotnet-script tool এবং PowerShell উভয়ই one-liner দিয়ে Base64 ডিকোড করতে পারে। debugging-এর সময় দ্রুত পরীক্ষার জন্য, এগুলো console app তৈরির চেয়ে দ্রুত।

bash
# PowerShell (Windows-এ built-in, Linux/macOS-এ উপলব্ধ)
[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("eyJob3N0IjoiMTAuMC4xLjUwIn0="))
# {"host":"10.0.1.50"}

# Linux / macOS native base64 command
echo "eyJob3N0IjoiMTAuMC4xLjUwIn0=" | base64 --decode
# {"host":"10.0.1.50"}

# macOS --decode এর বদলে -D ব্যবহার করে
echo "eyJob3N0IjoiMTAuMC4xLjUwIn0=" | base64 -D

# dotnet-script (install: dotnet tool install -g dotnet-script)
echo 'Console.WriteLine(System.Text.Encoding.UTF8.GetString(Convert.FromBase64String("eyJob3N0IjoiMTAuMC4xLjUwIn0=")));' | dotnet-script eval

# ডিকোড করুন এবং jq দিয়ে pretty-print করুন
echo "eyJob3N0IjoiMTAuMC4xLjUwIiwicG9ydCI6ODQ0M30=" | base64 --decode | jq .

ব্রাউজারে সরাসরি encoded string paste করতে, ToolDeck-এর Base64 decoder কোনো setup ছাড়াই standard এবং URL-safe উভয় variant হ্যান্ডল করে।

উচ্চ-কার্যক্ষমতার বিকল্প: System.Buffers.Text.Base64

System.Buffers.Text.Base64 class, .NET Core 2.1 থেকে উপলব্ধ, .NET string-এর বদলে raw UTF-8 byte span নিয়ে কাজ করে। এটি string-থেকে-byte conversion overhead সম্পূর্ণ এড়িয়ে যায় — কোনো intermediate string allocation নেই, UTF-16 encoding step নেই। ASP.NET Core middleware-এ আমি এটি ব্যবহার করি যেখানে incoming ডেটা ইতিমধ্যে request body থেকে ReadOnlySpan<byte>। শুধু Convert.FromBase64String()-এ পাস করতে একটি string তৈরি করলে কোনো কারণ ছাড়াই allocation দ্বিগুণ হয়। .NET 8-এ BenchmarkDotNet tests-এ, span-based path 1 KB-এর নিচের payload-এর জন্য মোটামুটি 2-3x দ্রুত এবং বড় ইনপুটে GC pressure flat থাকায় পার্থক্য বাড়ে।

C# (.NET 6+)
using System;
using System.Buffers.Text;
using System.Text;

// HTTP request body থেকে raw UTF-8 bytes simulate করুন
byte[] utf8Input = Encoding.UTF8.GetBytes("eyJob3N0IjoiMTAuMC4xLjUwIiwicG9ydCI6ODQ0M30=");

byte[] output = new byte[Base64.GetMaxDecodedFromUtf8Length(utf8Input.Length)];

OperationStatus status = Base64.DecodeFromUtf8(
    utf8Input, output, out int bytesConsumed, out int bytesWritten);

if (status == OperationStatus.Done)
{
    string result = Encoding.UTF8.GetString(output.AsSpan(0, bytesWritten));
    Console.WriteLine(result);
    // {"host":"10.0.1.50","port":8443}
    Console.WriteLine($"Consumed: {bytesConsumed}, Written: {bytesWritten}");
    // Consumed: 44, Written: 31
}
else
{
    Console.WriteLine($"Decode failed: {status}");
    // Possible: InvalidData, DestinationTooSmall, NeedMoreData
}

রিটার্ন টাইপ হলো OperationStatus — চারটি মান সহ enum: Done, InvalidData, DestinationTooSmall, এবং NeedMoreData। শেষটি streaming ডেটার partial decoding-এর জন্য উপকারী। সম্পূর্ণ zero allocation-এর জন্য, new byte[]-এর বদলে ArrayPool<byte>.Shared.Rent() সহ এটি ব্যবহার করুন।

DecodeFromUtf8InPlace — ইনপুট buffer ওভাররাইট করুন

C# (.NET 6+)
using System;
using System.Buffers.Text;
using System.Text;

// ইনপুট buffer decoded bytes দিয়ে ওভাররাইট হয়
byte[] data = Encoding.UTF8.GetBytes("c2VydmVyLWNvbmZpZw==");

OperationStatus status = Base64.DecodeFromUtf8InPlace(data, out int bytesWritten);

if (status == OperationStatus.Done)
{
    Console.WriteLine(Encoding.UTF8.GetString(data.AsSpan(0, bytesWritten)));
    // server-config
}
নোট:DecodeFromUtf8InPlace ইনপুট buffer পরিবর্তন করে। পরে মূল Base64 string দরকার হলে এটি ব্যবহার করবেন না — array-এর প্রথম bytesWritten byte এখন decoded ডেটা ধারণ করে, বাকিটা garbage।

একটি বিষয় জেনে রাখুন: System.Buffers.Text.Base64 সরাসরি URL-safe Base64 হ্যান্ডল করে না। ইনপুটে - এবং _ চরিত্র থাকলে (JWT টোকেন, উদাহরণস্বরূপ), এই মেথড কল করার আগে এখনো+ এবং / দিয়ে বদলাতে হবে। span-based API কঠোরভাবে RFC 4648 standard alphabet। কোনো DecodeFromUtf8Url variant নেই — আধুনিক API-তে Base64url কতটা সাধারণ তা বিবেচনায় এটি একটি বিস্ময়কর ফাঁক।

Syntax Highlighting সহ Terminal আউটপুট

Spectre.Console library JSON highlighting সহ rich terminal আউটপুট দেয় — Base64 ডিকোড করে ফলাফল দেখানো CLI tool তৈরিতে উপকারী। এটি dotnet add package Spectre.Console দিয়ে install করুন।

C# (.NET 6+)
using System;
using System.Text;
using Spectre.Console;
using Spectre.Console.Json;

string encoded = "eyJob3N0IjoiMTAuMC4xLjUwIiwicG9ydCI6ODQ0MywibWF4Q29ubiI6MTAwfQ==";
byte[] decoded = Convert.FromBase64String(encoded);
string json = Encoding.UTF8.GetString(decoded);

// Terminal-এ syntax highlighting সহ pretty-print করুন
AnsiConsole.Write(new JsonText(json));
// Colored JSON আউটপুট:
// {
//   "host": "10.0.1.50",
//   "port": 8443,
//   "maxConn": 100
// }

এটি বিশেষভাবে সেই CLI tool-এর জন্য উপকারী যা remote সার্ভিস থেকে configuration fetch ও decode করে। কয়েক লাইনেই Base64 config ডিকোড করুন, JSON-এ deserialize করুন, এবং highlighted আউটপুট print করুন। Spectre.Console-এ table rendering, progress bar, এবং tree view-ও আছে টার্মিনালে আরও জটিল decoded ডেটা structure দেখাতে।

সতর্কতা:Spectre.Console আউটপুটে ANSI escape sequence আছে। এটি ফাইলে pipe করবেন না বা API থেকে রিটার্ন করবেন না — শুধুমাত্র terminal display-এর জন্য ব্যবহার করুন।

CryptoStream দিয়ে বড় Base64 ফাইল Streaming

File.ReadAllText() দিয়ে 500 MB Base64 ফাইল লোড করে তারপর Convert.FromBase64String() কল করলে প্রায় 700 MB heap allocate হয়: string নিজেই (UTF-16, তাই ফাইলের আকারের দ্বিগুণ) এবং decoded byte array।CryptoStream + FromBase64Transform combination chunk করে ডিকোড করে, মেমরি ব্যবহার স্থির রাখে।

C# (.NET 6+)
using System.IO;
using System.Security.Cryptography;

string inputPath = "database-export.sql.b64";
string outputPath = "database-export.sql";

using var inputStream = new FileStream(inputPath, FileMode.Open, FileAccess.Read);
using var transform = new FromBase64Transform(FromBase64TransformMode.IgnoreWhiteSpaces);
using var base64Stream = new CryptoStream(inputStream, transform, CryptoStreamMode.Read);
using var outputStream = new FileStream(outputPath, FileMode.Create, FileAccess.Write);

base64Stream.CopyTo(outputStream);

Console.WriteLine($"Decoded {new FileInfo(outputPath).Length} bytes -> {outputPath}");

FromBase64TransformMode.IgnoreWhiteSpaces flag ম্যানুয়াল cleanup ছাড়াই line-wrapped Base64 (PEM ফাইল, email export) হ্যান্ডল করে। এই flag ছাড়া ইনপুটের line break FormatException ঘটায়। এটি .NET-এর Java-র getMimeDecoder()-এর সবচেয়ে কাছের equivalent — এটি নীরবে ডিকোডিংয়ের সময় whitespace চরিত্র এড়িয়ে যায়।

CryptoStream নামটি বিভ্রান্তিকর — Base64-এ cryptographic কিছু নেই। Microsoft FromBase64Transform-কে System.Security.Cryptography namespace-এ রেখেছে কারণ এটি ICryptoTransform implement করে, AES এবং অন্যান্য cipher transform-এর মতো একই interface। Stream নিজেই শুধু chunk করে যেকোনো transform-এর মধ্য দিয়ে ডেটা পাইপ করে। এটিকে একটি general-purpose streaming transform pipeline হিসেবে ভাবুন যা দুর্ভাগ্যক্রমে ভুল namespace-এ থাকে।

ASP.NET Core পরিস্থিতির জন্য Async streaming

C# (.NET 6+)
using System.IO;
using System.Security.Cryptography;

async Task DecodeStreamAsync(Stream inputStream, string outputPath)
{
    using var transform = new FromBase64Transform(FromBase64TransformMode.IgnoreWhiteSpaces);
    using var base64Stream = new CryptoStream(inputStream, transform, CryptoStreamMode.Read);
    await using var outputStream = new FileStream(
        outputPath, FileMode.Create, FileAccess.Write, FileShare.None,
        bufferSize: 81920, useAsync: true);

    await base64Stream.CopyToAsync(outputStream);
}

// Endpoint-এ ব্যবহার:
// await DecodeStreamAsync(Request.Body, "uploaded-file.bin");
নোট:ASP.NET Core handler-এ CopyTo থেকে CopyToAsync-এ পরিবর্তন করুন। Kestrel-এ request thread-এ Synchronous I/O ডিফল্টভাবে blocked এবংInvalidOperationException throw করে।

C#-এ Base64 JWT Token Payload কীভাবে ডিকোড করবেন

একটি JWT-তে dot দিয়ে আলাদা তিনটি Base64url-encoded segment আছে। মাঝের segment হলো payload। JWT library না টেনে এটি ডিকোড করা যায় — . দিয়ে split করুন, Base64url চরিত্র normalize করুন, padding ঠিক করুন, এবং Convert.FromBase64String() কল করুন। প্রথমবার প্রায় সবাই এতে হোঁচট খায় কারণ JWT + এবং /-এর বদলে - এবং _ ব্যবহার করে, এবং = padding বাদ দেয়।

C# (.NET 6+)
using System;
using System.Text;

static string DecodeJwtPayload(string token)
{
    string[] parts = token.Split('.');
    if (parts.Length != 3)
        throw new ArgumentException($"Invalid JWT: expected 3 segments, got {parts.Length}");

    // payload নিন (দ্বিতীয় segment)
    string payload = parts[1];

    // URL-safe চরিত্র স্ট্যান্ডার্ড Base64 দিয়ে বদলান
    payload = payload.Replace('-', '+').Replace('_', '/');

    // 4-এর গুণিতকে প্যাড করুন
    switch (payload.Length % 4)
    {
        case 2: payload += "=="; break;
        case 3: payload += "=";  break;
    }

    byte[] bytes = Convert.FromBase64String(payload);
    return Encoding.UTF8.GetString(bytes);
}

// real-shaped token দিয়ে পরীক্ষা করুন
string token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9"
    + ".eyJzdWIiOiJ1c3ItNjcyIiwiaXNzIjoiYXV0aC5leGFtcGxlLmNvbSIsImV4cCI6MTc0MTk1NjgwMCwicm9sZXMiOlsiYWRtaW4iLCJiaWxsaW5nIl19"
    + ".SIGNATURE_PLACEHOLDER";

Console.WriteLine(DecodeJwtPayload(token));
// {"sub":"usr-672","iss":"auth.example.com","exp":1741956800,"roles":["admin","billing"]}

দ্রুত নোট: এটি শুধু payload পড়ে। এটি signature যাচাই করে না। Production auth validation-এর জন্য Microsoft.IdentityModel.JsonWebTokens-এর মতো proper library ব্যবহার করুন। কিন্তু debugging, logging, এবং test assertion-এর জন্য এই ম্যানুয়াল পদ্ধতিই যথেষ্ট।

decoded JWT payload typed object-এ parse করা

JSON string পাওয়ার পর, string manipulation ছাড়াই individual claim অ্যাক্সেস করতে System.Text.Json দিয়ে deserialize করুন:

C# (.NET 6+)
using System;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;

record JwtPayload(
    [property: JsonPropertyName("sub")] string Subject,
    [property: JsonPropertyName("iss")] string Issuer,
    [property: JsonPropertyName("exp")] long Expiration,
    [property: JsonPropertyName("roles")] string[] Roles
);

// উপরের DecodeJwtPayload() এর পর
string json = DecodeJwtPayload(token);
var claims = JsonSerializer.Deserialize<JwtPayload>(json)!;

Console.WriteLine($"User: {claims.Subject}");
Console.WriteLine($"Issuer: {claims.Issuer}");
Console.WriteLine($"Expires: {DateTimeOffset.FromUnixTimeSeconds(claims.Expiration):u}");
Console.WriteLine($"Roles: {string.Join(", ", claims.Roles)}");
// User: usr-672
// Issuer: auth.example.com
// Expires: 2025-03-14 12:00:00Z
// Roles: admin, billing

সাধারণ ভুল

Production C# সার্ভিসে আমি এই প্রতিটি ভুল নিজে করেছি। প্রথম দুটি Base64-সংক্রান্ত বেশিরভাগ bug-এর জন্য দায়ী যা আমি code review-এ দেখি। প্রতিটি ভুল আলাদা করে দেখলে সহজ মনে হয়, কিন্তু একটি বড় feature-এর মাঝে Base64 decoding পাইপলাইনের মাত্র একটি ধাপ হলে এগুলো সহজেই মিস হয়।

ইনপুট থেকে whitespace মুছতে ভুলে যাওয়া

সমস্যা: config ফাইল, environment variable, বা user input থেকে পড়া Base64 string-এ প্রায়ই trailing newline থাকে। Convert.FromBase64String() Base64 alphabet-এর বাইরের যেকোনো চরিত্র প্রত্যাখ্যান করে, \r\n সহ।

সমাধান: ডিকোড করার আগে whitespace মুছতে .Trim() বা .Replace() কল করুন।

Before · C#
After · C#
// Environment variable-এ trailing newline আছে
string encoded = Environment.GetEnvironmentVariable("DB_PASS_B64")!;
byte[] decoded = Convert.FromBase64String(encoded);
// FormatException: The input is not a valid Base-64 string
string encoded = Environment.GetEnvironmentVariable("DB_PASS_B64")!;
string cleaned = encoded.Replace("\n", "").Replace("\r", "").Trim();
byte[] decoded = Convert.FromBase64String(cleaned);
Console.WriteLine(Encoding.UTF8.GetString(decoded));
URL-safe Base64-এ Convert.FromBase64String() ব্যবহার করা

সমস্যা: JWT টোকেন এবং কিছু API payload - এবং _ (URL-safe alphabet) ব্যবহার করে। স্ট্যান্ডার্ড decoder শুধু + এবং / গ্রহণ করে — প্রথম - চরিত্রেই FormatException throw করে।

সমাধান: ডিকোড করার আগে - কে + দিয়ে এবং _ কে / দিয়ে বদলান। padding-ও ঠিক করুন।

Before · C#
After · C#
// JWT payload — URL-safe Base64 ব্যবহার করে
string payload = "eyJzdWIiOiJ1c3ItNjcyIn0";
byte[] decoded = Convert.FromBase64String(payload);
// FormatException
string payload = "eyJzdWIiOiJ1c3ItNjcyIn0";
payload = payload.Replace('-', '+').Replace('_', '/');
switch (payload.Length % 4)
{
    case 2: payload += "=="; break;
    case 3: payload += "="; break;
}
byte[] decoded = Convert.FromBase64String(payload);
Console.WriteLine(Encoding.UTF8.GetString(decoded));
// {"sub":"usr-672"}
binary ডেটা string-এ রূপান্তর করা

সমস্যা: decoded image বা protobuf bytes-এ Encoding.UTF8.GetString() কল করলে garbage তৈরি হয়। আরও খারাপ, সেই string আবার bytes-এ রূপান্তর করলে নীরবে ডেটা নষ্ট হয় কারণ অবৈধ UTF-8 sequence প্রতিস্থাপিত হয়।

সমাধান: পুরো pipeline জুড়ে binary ডেটা byte[] হিসেবে রাখুন। শুধু তখন GetString() কল করুন যখন জানেন কন্টেন্ট text।

Before · C#
After · C#
byte[] decoded = Convert.FromBase64String(pngBase64);
string imageStr = Encoding.UTF8.GetString(decoded); // binary নষ্ট করে
File.WriteAllText("image.png", imageStr); // ভাঙা ফাইল
byte[] decoded = Convert.FromBase64String(pngBase64);
// সরাসরি bytes লিখুন — string conversion নেই
File.WriteAllBytes("image.png", decoded);
encoding না দেওয়া (platform behavior-এ ডিফল্ট করা)

সমস্যা: কিছু পুরনো .NET Framework API ডিফল্টভাবে system-এর current ANSI code page ব্যবহার করে, যা machine-এ ভিন্ন হয়। code page 1252 সহ Windows server এবং UTF-8 সহ Linux container একই bytes থেকে ভিন্ন string তৈরি করে।

সমাধান: সবসময় Encoding.UTF8 explicitly দিন। platform default-এ কখনো নির্ভর করবেন না।

Before · C#
After · C#
byte[] decoded = Convert.FromBase64String(encoded);
// Encoding.Default platform-এ ভিন্ন হয়
string result = Encoding.Default.GetString(decoded);
byte[] decoded = Convert.FromBase64String(encoded);
string result = Encoding.UTF8.GetString(decoded);
// Windows, Linux, macOS-এ consistent

মেথড তুলনা

.NET-এ বেশিরভাগ ডেভেলপারের ধারণার চেয়ে বেশি Base64 decoding মেথড আছে। নিচের table-এ প্রতিটি built-in option এবং দুটি সবচেয়ে সাধারণ third-party বিকল্প আলোচনা করা হয়েছে। "Allocation" column উচ্চ-থ্রুপুট সার্ভিসে সবচেয়ে গুরুত্বপূর্ণ — প্রতিটি কলে নতুন byte[] allocate করে এমন মেথড tight loop-এ GC-তে চাপ সৃষ্টি করে।

মেথড
অ্যালোকেশন
এরর হ্যান্ডলিং
স্ট্রিমিং
কাস্টম টাইপ
ইন্সটল প্রয়োজন
Convert.FromBase64String()
New byte[]
FormatException
না
না
না (.NET Framework 1.1+)
Convert.TryFromBase64String()
Caller Span
Returns false
না
না
না (.NET 5+)
Convert.FromBase64CharArray()
New byte[]
FormatException
না
না
না (.NET Framework 1.1+)
Base64.DecodeFromUtf8()
Caller Span
OperationStatus
আংশিক
না
না (.NET Core 2.1+)
Base64.DecodeFromUtf8InPlace()
In-place
OperationStatus
না
না
না (.NET Core 2.1+)
CryptoStream + FromBase64Transform
Streaming buffer
Exception
হ্যাঁ
না
না (.NET Framework 2.0+)
BouncyCastle Base64
New byte[]
Exception
হ্যাঁ
না
হ্যাঁ (NuGet)

দৈনন্দিন কাজে: Convert.FromBase64String()। user input validate করার hot path-এ: TryFromBase64String()। raw request bytes নিয়ে কাজ করা ASP.NET Core middleware-এ: Base64.DecodeFromUtf8()। বড় ফাইলে: CryptoStream + FromBase64Transform। BouncyCastle শুধু তখন ব্যবহার করুন যদি এটি অন্য cryptographic অপারেশনের জন্য আপনার dependency tree-তে ইতিমধ্যে থাকে।

কিছু compile না করে দ্রুত যাচাইয়ের জন্য, অনলাইন Base64 decoder একটি one-off console app লেখার চেয়ে দ্রুত।

সচরাচর জিজ্ঞাসা

C#-এ Base64 স্ট্রিং টেক্সটে কীভাবে ডিকোড করব?

Convert.FromBase64String() কল করে byte array পান, তারপর Encoding.UTF8.GetString()-এ পাস করুন। এনকোডিং অবশ্যই মূল এনকোডিংয়ের সাথে মিলতে হবে — UTF-8 প্রায় সব আধুনিক সিস্টেমের জন্য নিরাপদ ডিফল্ট। ইনপুটে whitespace বা line break থাকলে ডিকোড করার আগে .Trim() বা সেগুলো মুছে ফেলুন।

C# (.NET 6+)
using System;
using System.Text;

string encoded = "cG9zdGdyZXM6eGs5bVAycVI=";
byte[] bytes = Convert.FromBase64String(encoded);
string result = Encoding.UTF8.GetString(bytes);
Console.WriteLine(result);
// postgres:xk9mP2qR

Convert.FromBase64String() এবং Convert.TryFromBase64String()-এর মধ্যে পার্থক্য কী?

FromBase64String() অবৈধ ইনপুটে FormatException throw করে। TryFromBase64String() একটি bool রিটার্ন করে এবং ফলাফল caller-provided Span<byte>-এ লেখে, যা hot path-এ exception overhead এড়াতে উপযুক্ত। TryFromBase64String() ব্যবহার করতে .NET 5 বা পরবর্তী সংস্করণ প্রয়োজন।

C# (.NET 6+)
using System;

string input = "maybe-not-valid-base64!!";
Span<byte> buffer = stackalloc byte[256];

if (Convert.TryFromBase64String(input, buffer, out int written))
    Console.WriteLine($"Decoded {written} bytes");
else
    Console.WriteLine("Invalid Base64 input");

C#-এ Base64url JWT payload কীভাবে ডিকোড করব?

টোকেনটি ডট দিয়ে ভাগ করুন, দ্বিতীয় সেগমেন্ট নিন, - কে + দিয়ে এবং _ কে / দিয়ে বদলান, = দিয়ে 4-এর গুণিতকে প্যাড করুন, তারপর Convert.FromBase64String() কল করুন। JWT টোকেন URL-safe Base64 alphabet ব্যবহার করে, যা .NET-এর স্ট্যান্ডার্ড ডিকোডার সরাসরি হ্যান্ডল করে না।

C# (.NET 6+)
string token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ1c3ItNjcyIn0.SIG";
string payload = token.Split('.')[1];
payload = payload.Replace('-', '+').Replace('_', '/');
switch (payload.Length % 4)
{
    case 2: payload += "=="; break;
    case 3: payload += "="; break;
}
byte[] bytes = Convert.FromBase64String(payload);
Console.WriteLine(Encoding.UTF8.GetString(bytes));
// {"sub":"usr-672"}

C#-এ Base64 ডিকোড করার সময় সঠিক Encoding কীভাবে বেছে নেব?

ডিফল্ট হিসেবে Encoding.UTF8 ব্যবহার করুন — এটি ASCII এবং মাল্টি-বাইট Unicode চরিত্র হ্যান্ডল করে। Encoding.ASCII শুধুমাত্র তখন ব্যবহার করুন যখন নিশ্চিত যে ডেটা pure 7-bit ASCII। Encoding.Unicode (.NET-এ UTF-16LE) ব্যবহার করুন শুধুমাত্র যখন মূল ডেটা UTF-16 হিসেবে এনকোড করা ছিল, যা কখনো কখনো Windows-internal strings এবং PowerShell export-এ দেখা যায়।

Convert.FromBase64String() কেন FormatException throw করে?

তিনটি সাধারণ কারণ: ইনপুটে whitespace বা line break আছে (ডিকোড করার আগে সেগুলো মুছুন), ইনপুটে - এবং _ এর মতো URL-safe চরিত্র আছে (সেগুলো যথাক্রমে + এবং / দিয়ে বদলান), অথবা padding অনুপস্থিত বা ভুল (padding-এর পরে মোট দৈর্ঘ্য অবশ্যই 4-এর গুণিতক হতে হবে)। Java-র বিপরীতে, .NET-এ কোনো built-in MIME decoder নেই যা whitespace সহ্য করে — আপনাকে নিজেই ইনপুট পরিষ্কার করতে হবে অথবা IgnoreWhiteSpaces মোড সহ CryptoStream এবং FromBase64Transform ব্যবহার করতে হবে।

C# (.NET 6+)
// Whitespace ঠিক করুন
string cleaned = rawInput.Replace("\n", "").Replace("\r", "").Trim();
byte[] decoded = Convert.FromBase64String(cleaned);

C#-এ বড় Base64 ডেটা stream করে ডিকোড করা কি সম্ভব?

হ্যাঁ। System.Security.Cryptography থেকে FromBase64Transform সহ CryptoStream ব্যবহার করুন। এটি পড়ার সময় chunk করে ডিকোড করে, তাই ফাইলের আকার যতই হোক মেমরি ব্যবহার স্থির থাকে। ইনপুটে line break থাকলে FromBase64TransformMode.IgnoreWhiteSpaces পাস করুন। .NET 6+-এ ম্যানুয়াল chunked processing-এর জন্য Base64.DecodeFromUtf8() সহ IAsyncEnumerable pattern-ও ব্যবহার করা যায়, তবে ফাইল-থেকে-ফাইল ডিকোডিংয়ে CryptoStream বেশি সহজ।

C# (.NET 6+)
using System.IO;
using System.Security.Cryptography;

using var input = File.OpenRead("payload.b64");
using var transform = new FromBase64Transform();
using var cryptoStream = new CryptoStream(input, transform, CryptoStreamMode.Read);
using var output = File.Create("payload.bin");
cryptoStream.CopyTo(output);

সংশ্লিষ্ট টুল

  • Base64 Encoder — ব্রাউজারে text বা binary ডেটা Base64-এ encode করুন, C# unit test-এ paste করার জন্য test fixture তৈরিতে উপকারী।
  • JWT Decoder — একসাথে তিনটি JWT segment decode ও inspect করুন, field-by-field payload inspection সহ — শুধু token পড়তে হলে C# helper লেখার চেয়ে দ্রুত।
  • URL Decoder — URL-encoded string percent-decode করুন, API response-এ Base64url ডেটা percent-encoded query parameter-এর সাথে মিশ্রিত থাকলে উপকারী।
  • JSON Formatter — Base64 JWT payload বা API config decode করার পর JSON এখানে paste করে pretty-print ও structure যাচাই করুন।
এছাড়াও পাওয়া যায়:GoJava
AP
Alexei PetrovGame Developer & Unity Engineer

Alexei is a game developer who has shipped multiple titles using Unity and C#. He focuses on gameplay systems, runtime performance, and the serialisation and data-management patterns unique to game development. He writes about Unity scripting, C# async/await in game contexts, asset serialisation, binary data handling, and the intersection of game engineering and general software craftsmanship.

ER
Emma Richardsonপ্রযুক্তিগত পর্যালোচক

Emma is a .NET developer and cloud engineer who builds production APIs and backend services with ASP.NET Core and Azure. She has worked on everything from microservice migrations to real-time SignalR applications. She writes about C# language features, the System.Text.Json and Newtonsoft.Json ecosystems, Azure integrations, and the architectural patterns that make .NET services scalable and maintainable.