مقدمة
BASE64 هي طريقة تمثيل تمثل بيانات ثنائية تعتمد على 64 حرفًا قابلة للطباعة. نظرًا لأن 2 يساوي 64 إلى طاقة 6 ، كل 6 بت هي وحدة ، تقابل حرفًا معينًا للطباعة. تحتوي ثلاثة بايت على 24 بت ، تقابل 4 وحدات BASE64 ، أي 3 بايت تحتاج إلى تمثيلها 4 أحرف قابلة للطباعة. يمكن استخدامه كترميز نقل رسائل البريد الإلكتروني. تتضمن الأحرف القابلة للطباعة في BASE64 الحروف AZ و AZ والأرقام 0-9 ، لذلك هناك 62 حرفًا في المجموع. يختلف الرموسون الآخران القابلون للطباعة في أنظمة مختلفة ، بشكل عام + و /.
مبدأ التحويل
مصدر البيانات المباشر لـ BASE64 هو تسلسل ثنائي. بالطبع ، يمكنك أيضًا تحويل الصور والنصوص والصوت والفيديو إلى تسلسل ثنائي ثم تحويلها إلى ترميز BASE64. ما نناقشه هنا هو كيفية تحويل ثنائي إلى ترميز BASE64 ، وتواصل ضبطه لكيفية تحويل الصور والنصوص والصوت والفيديو إلى تسلسلات ثنائية.
قبل التحويل ، حدد جدول فهرس ، والذي يحدد كيفية التحويل:
عند التحويل ، قمنا أولاً بتجميع التسلسلات الثنائية ، وكل 6 بت هي مجموعة. ومع ذلك ، إذا كان عدد البايتات المشفرة لا يمكن تقسيمها على 3 ، فسيكون هناك 1 أو بايتان في النهاية. يمكنك استخدام الطريقة التالية لمعالجتها: أولاً استخدم قيمة 0-بايت للتعويض في النهاية بحيث يمكن تقسيمها على 3 ، ثم ترميز BASE64. أضف رقمًا أو اثنين من الأرقام إلى نص Base64 المشفر لتمثيل عدد البايتات المراد ملؤها. وهذا يعني ، عندما يكون هناك ثمانية تركت في آخر 6 بت قاعدة بايت 6 بت ، هناك أربعة بتات من 0 ، وتوصيل اثنين من العلامات المتساوية في النهاية ؛ إذا كان هناك اثنان من الثمانيين في كتلة بايت قاعدة 6 بت الأخيرة ، فهناك بتات من القيمة 0 ، ويتم إرفاق علامة متساوية في النهاية. الرجوع إلى الجدول التالي:
JavaScript ينفذ Base64
بمجرد فهم المبدأ ، سيكون من السهل تنفيذها.
define (function (require ، orports ، module) {var code = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/". split ("") الترميز * param {string} * return {string} * الذيل) ؛ 2)] لـ (var i = 0 ؛ i <str.length ؛ i ++) {if (str [i]! = ") {var decode = code.indexof (str [i]). bitstring.length - tail * 2) ؛ str.charcodeat (var i = 0 ؛ i <bin.length ؛ I += 8) Bintostr (BASE64TOBIN (STR)) ؛BASE64 ترميز بيانات الصورة
لتحويل بيانات الصورة إلى BASE64 ، يجب أولاً الحصول على البيانات الثنائية للصورة. يمكن الحصول على البيانات الثنائية للصورة من خلال واجهة قماش. التنفيذ المحدد هو:
وظيفة getCanvas (w ، h) {var c = document.createElement ('canvas') ؛ c.width = w ؛ c.hight = h ؛ return c ؛} وظيفة getPixels (img) {var c = getCanvas (img.width ، img.height) ؛ var ctx = c.getContext ('2d') ؛ CTX.DrawImage (IMG ، 0 ، 0) ؛ return ctx.getimagedata (0 ، 0 ، C.Width ، C.Height) ؛}بعد الحصول على البيانات الثنائية للصورة ، فإن الخطوة التالية هي تشفيرها. لأن الصورة لا تحتوي فقط على معلومات البكسل ، ولكن أيضًا معلومات الطول والعرض. لذلك ، أثناء ترميز معلومات البكسل ، يجب أيضًا ترميز معلومات العرض والارتفاع وفقًا لاتفاق معين. لقد تعاملت معها مثل هذا:
تحويل البيانات العددية للبكسل للصورة إلى تسلسل ثنائي ؛ اجمع بين معلومات العرض والارتفاع في $$width,height$$ لتحويله إلى تسلسل ثنائي ؛ الجمع بين التسلسل الثنائي لمعلومات البكسل للصورة والتسلسل الثنائي لعرض وارتفاع الصورة ، ثم تشفير BASE64
التنفيذ المحدد هو:
دالة img2base64 (img) {var imgdata = getPixels (img) .Data ؛ var imgwidth = getPixels (img) .width ؛ var imgheight = getPixels (img). height ؛ var bin = "" ؛ لـ (var i = 0 ؛ i <imgdata.length ؛ i ++) {bin+= base.numtoString (imgdata [i]) ؛ } bin = bin + base.stringtobin ("$$" + imgwidth + "،" + imgheight + "$$") ؛ return base.bintobase64 (bin) ؛}فك تشفير بيانات Image Base64
فك التشفير هو العملية العكسية للترميز. العملية تقريبًا:
فك تشفير معلومات BASE64 للصورة للحصول على تسلسل ثنائي يحتوي على معلومات البكسل للصورة والعرض والارتفاع ؛ ثم فك تشفير التسلسل الثنائي في سلسلة للحصول على معلومات الارتفاع والعرض ؛ قم بإزالة معلومات الارتفاع والعرض في التسلسل الثنائي للحصول على معلومات البكسل ؛ إنشاء مصفوفة بكسل بناءً على معلومات البكسل ؛ قم بإنشاء كائن صورة Imagedata استنادًا إلى مصفوفة البكسل والعرض والارتفاع ؛ استخدم putimagedata لرسم الصورة.
تطبيق التعليمات البرمجية المحدد هو:
دالة الطلاء (imgdata) {var canvas = document.getElementById ("mycanvas") ؛ var ctx = canvas.getContext ("2d") ؛ ctx.fillRect (0 ، 0 ، imgdata.width ، imgdata.height) ؛ ctx.putimagedata (imgdata ، 0 ، 0) ؛ } دالة base642Img (data) {var str = base.bintoStr (base.base64tobin (data)) ؛ var imgwidth = str.match (// $/$ (/d+) ، (/d+)/$/$$/، "") [1] ؛ var imgheight = str.match (// $/$ (/d +) ، (/d +)/$/$$/، "") [2] var imgdata = base.base64tobin (data) .replace (base.stringtobin ("$$" + imgwidth + "،" var imagedataarray = new uint8clampedarray (imgwidth * imgheight * 4) ؛ لـ (var i = 0 ؛ i <imagedataarray.length ؛ i ++) {imagedataarray [i] = parseint (imgdata.substr (i * 8 ، 8) ، 2) ؛ } إرجاع Imagedata الجديد (Imagedataarray ، Imgwidth ، imgheight) ؛ }