ब्राउज़र में Base64 और Node.js: एक बाइट अनुबंध, दो एपीआई

ब्राउज़र में TextEncoder और Node.js में Buffer का उपयोग करें, फिर समान यूनिकोड और बाइनरी फिक्स्चर के विरुद्ध उनके आउटपुट का परीक्षण करें।

एक ब्राउज़र क्लाइंट और Node.js सेवा को समान बाइट्स के लिए समान Base64 उत्पन्न करना चाहिए। ऐसा करने के लिए उन्हें उसी API का उपयोग करने की आवश्यकता नहीं है। महत्वपूर्ण समझौता पाठ, वर्णमाला का बाइट प्रतिनिधित्व और पैडिंग और अमान्य इनपुट का उपचार है।

ब्राउज़र: UTF-8 चरण को स्पष्ट बनाएं

पारंपरिक ब्राउज़र फ़ंक्शंस बाइट स्ट्रिंग्स पर काम करते हैं। यूनिकोड टेक्स्ट को इसके साथ कनवर्ट करें TextEncoder, फिर उन बाइट्स को एन्कोड करें। वापसी पथ पर, बाइट सरणी का पुनर्निर्माण करें और UTF-8 को स्पष्ट रूप से डीकोड करें। यह उदाहरण फ़ंक्शन तर्कों में एक बड़े सरणी का विस्तार करने से बचने के लिए एक लूप का उपयोग करता है, हालांकि एक उत्पादन फ़ाइल एनकोडर को अभी भी बाउंडेड चंक्स या एक उपयुक्त बाइट API का उपयोग करना चाहिए।

const text = '中文😊';
const bytes = new TextEncoder().encode(text);
let binary = '';
for (const byte of bytes) binary += String.fromCharCode(byte);
const encoded = btoa(binary);
console.log(encoded); // 5Lit5paH8J+Yig==
const decodedBytes = Uint8Array.from(atob(encoded), c => c.charCodeAt(0));
const decoded = new TextDecoder('utf-8', { fatal: true }).decode(decodedBytes);
console.log(decoded); // 中文😊

Node.js: Buffer को बाइट सीमा पर रखें

Buffer.from(text, 'utf8') टेक्स्ट एन्कोडिंग को दृश्यमान बनाता है। बुला रहा है toString('base64') फिर उन बाइट्स का प्रतिनिधित्व करता है। Buffer को डिकोड करने से बाइनरी डेटा सुरक्षित रहता है; UTF-8 स्ट्रिंग में तुरंत कनवर्ट करना केवल तभी उचित होता है जब पेलोड को टेक्स्ट के रूप में जाना जाता है।

import { Buffer } from 'node:buffer';
const encoded = Buffer.from('中文😊', 'utf8').toString('base64');
console.log(encoded); // 5Lit5paH8J+Yig==
const bytes = Buffer.from(encoded, 'base64');
console.log(new TextDecoder('utf-8', { fatal: true }).decode(bytes)); // 中文😊

उदाहरण में घातक TextDecoder जानबूझकर है। साधारण Buffer UTF-8 स्ट्रिंग रूपांतरण अमान्य इनपुट के लिए प्रतिस्थापन वर्ण सम्मिलित कर सकता है। एक सफल पाठ प्रदर्शन तब छिपाएगा कि मूल बाइट्स को ईमानदारी से प्रस्तुत नहीं किया जा सका।

सत्यापन पर अलग से सहमति

नोड का Base64 डिकोडर कुछ इनपुट फॉर्म स्वीकार करता है जिन्हें एक सख्त एप्लिकेशन अस्वीकार कर सकता है। सफल Buffer रूपांतरण को इस बात के प्रमाण के रूप में उपयोग न करें कि प्रोटोकॉल का विहित प्रतिनिधित्व प्रदान किया गया था। यदि हस्ताक्षर, कैश कुंजी या इंटरऑपरेबल क्रमबद्धता के लिए सटीक वाक्यविन्यास मायने रखता है, तो डिकोडिंग से पहले इसकी जांच करें।

साझा प्रतिगमन परीक्षण के लिए, ASCII, चीनी, इमोजी, एक शून्य बाइट, बाइट एफएफ, और तीन-बाइट सीमा के आसपास की सभी लंबाई शामिल करें। रनटाइम में बाइट्स की तुलना करें। इसके अलावा URL-सुरक्षित आउटपुट का एक फिक्स्चर के साथ परीक्षण करें जिसमें वास्तव में प्रतिस्थापित वर्ण शामिल हों; एक इनपुट जिसका आउटपुट केवल अक्षर है, यह साबित नहीं कर सकता कि वैरिएंट विकल्प काम करता है।

नोड में फ़ाइलें पढ़ते समय, फ़ाइल पढ़ने के लिए टेक्स्ट एन्कोडिंग लागू करने के बजाय लौटाए गए Buffer को रखें। ब्राउज़र में, उपयोग करें File.arrayBuffer(). ये छोटे सीमा विकल्प अधिकांश आकस्मिक भ्रष्टाचार से बचते हैं। देखिये Node.js Buffer नोड व्यवहार के लिए और एमडीएन: btoa() ब्राउज़र बाइट-स्ट्रिंग अनुबंध के लिए.