JavaScript Base64 وصفات لـ JSON والملفات ومصفوفات البايت

استخدم وصفات UTF-8-safe JavaScript للحمولات JSON والملفات المحددة دون معالجة البيانات الثنائية كنص عن طريق الخطأ.

يبدأ كود Base64 المفيد بتحديد المدخلات الفعلية. تحتاج السلسلة JavaScript إلى ترميز أحرف؛ الملف يحتوي بالفعل على بايت؛ تحتاج قيمة JSON إلى إجراء تسلسل أولاً. إن إبقاء هذه الخطوات مرئية يجعل تصحيح الأخطاء أسهل ويمنع الترميز المزدوج غير المقصود.

قم بتشفير قيمة JSON صغيرة

قم بتسلسل القيمة مرة واحدة بالضبط، وقم بتشفير تلك السلسلة كـ UTF-8، ثم قم بتشفير البايتات كـ Base64. يتضمن هذا المثال حقلاً غير ASCII لالتقاط عمليات التنفيذ التي تعمل مع اللغة الإنجليزية فقط. وهو مخصص للحمولات الصغيرة؛ تزيد سلسلة البايت المؤقتة من استخدام الذاكرة.

const value = { message: '你好', count: 3 };
const text = JSON.stringify(value);
let binary = '';
for (const byte of new TextEncoder().encode(text)) {
  binary += String.fromCharCode(byte);
}
const encoded = btoa(binary);
const bytes = Uint8Array.from(atob(encoded), c => c.charCodeAt(0));
const json = new TextDecoder('utf-8', { fatal: true }).decode(bytes);
console.log(JSON.parse(json).message); // 你好

لا يضمن فك تشفير Base64 الناجح صلاحية JSON. معالجة فك التشفير UTF-8 و JSON.parse كنقاط فشل منفصلة. عندما يكون المحتوى الذي تم فك ترميزه عبارة عن سلسلة تحتوي بالفعل على JSON، فإن إجراء تسلسل لها مرة أخرى يضيف علامات الاقتباس والهروب؛ الذي يغير الحمولة.

قراءة الملف المحدد بالبايت

للمتصفح File، استخدم arrayBuffer() عندما تحتاج إلى البايتات الأساسية. لا تستخدم file.text() بالنسبة لصورة أو أرشيف أو ملف مشفر: يمكن أن تصبح تسلسلات الأحرف غير الصالحة أحرفًا بديلة. إذا كانت وجهتك تحتاج إلى بيانات URI، FileReader.readAsDataURL() يوفر المجمع بالإضافة إلى بيانات Base64.

// file is a File selected by the user.
const bytes = new Uint8Array(await file.arrayBuffer());
console.log(bytes.byteLength); // original file size in bytes
// Pass bytes to a byte-oriented encoder, not TextEncoder.

عمليات فحص ذهابًا وإيابًا تكتشف الأخطاء الحقيقية

قارن البايتات التي تم فك تشفيرها مع صفيف البايتات الأصلي. لا يمكن لمقارنة لقطات الشاشة أو أسماء الملفات اكتشاف البايت الذي تم تغييره. قم بتضمين إدخال فارغ، وجميع قيم البايت من 0 إلى 255، والنص الصيني، والرموز التعبيرية، والحمولة التي يترك طولها بايتًا واحدًا أو بايتين في المجموعة النهائية. بالنسبة لمجموعة من الملفات، احتفظ باسم كل ملف وحجمه ونتيجته بشكل مستقل بحيث لا يمكن لخطأ واحد أن يحل محل مخرجات ناجحة أخرى.

احتفظ بالتحويلات المحلية ما لم يستدعي سير عملك API عمدًا. لا يزال طلب الشبكة الذي يحتوي على الإخراج المشفر يرسل البيانات الأساسية في شكل قابل للعكس. لمعرفة سلوك سلسلة البايت وحدود Unicode لوظيفة المتصفح، راجع MDN: بتوا ().