تعد BASE64 واحدة من أكثر طرق الترميز شيوعًا على الشبكة لنقل رمز بايت 8bit. يمكنك التحقق من RFC2045 ~ RFC2049 ، والذي يحتوي على مواصفات MIME مفصلة. يتطلب BASE64 تحويل كل ثلاثة بايت 8 بت إلى أربعة بايت 6bit (3*8 = 4*6 = 24) ، ثم إضافة اثنين من 0 إلى 6 بت لتشكيل أربعة بايت 8bit. بمعنى آخر ، ستكون السلسلة المحولة من الناحية النظرية 1/3 أطول من تلك الأصلية.
وظائف PHP: BASE64_ENCODE () و BASE64_DECODE ()
BASE64 الترميز ، فك تشفير مبدأ
يقوم الترميز BASE64 في الواقع بتحويل 3 بايت 8 بت إلى 4 بايتات 6 بت ، (3*8 = 4*6 = 24) هذه البايتات الستة الستة لا تزال في الواقع 8 بتات ، ولكن يتم تعيين البتات العليا على 0. (0 ~ 63).
في الواقع ، هناك العديد من الأحرف غير المرئية في رمز ASCII بين 0 و 63 ، لذلك يجب إجراء رسم خرائط آخر ، وجدول رسم الخرائط هو
'a' ~ 'Z'؟ ASCII (0 ~ 25)
'a' ~ 'Z'؟ ASCII (26 ~ 51)
'0' ~ '9'؟ ASCII (52 ~ 61)
''؟ ASCII (62)
'/'؟ ASCII (63)
سيؤدي ذلك إلى تحويل 3 بايت 8 بت إلى 4 أحرف مرئية.
الطريقة المحددة لتقسيم البايت هي: (الشكل (مرسوم بشكل سيء ، فهم الروح :-))
AAAAAABB CCCDDDDDDDFFF // ABCDEF هو في الواقع 1 أو 0. من أجل رؤية بوضوح ، استخدم ABCDEF بدلاً من ذلك
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
بايت 1 بايت 2 بايت 3
||
//
00AAAAAA 00BBCCCC 00DDDEE 00FFFFFF
ملاحظة: إن بتات البايت الثلاثة أعلاه هي نص أصلي ، والبايت الأربعة التالية هي ترميز BASE64 ، والأولين بت هما 0.
عند الانقسام بهذه الطريقة ، يجب أن يكون عدد البايتات في النص الأصلي مضاعفًا من 3. عندما لا يمكن الوفاء بهذا الشرط ، استخدم جميع بايت الصفر
تكملة ، عند التحويل ، يتم استبدال ترميز BASE64 بـ = علامة ، وهذا هو السبب في أن بعض ترميزات BASE64 تنتهي بعلامة أو اثنين من العلامات المتساوية.
سبب الحزمة ، ولكن هناك علامتين متساويتين على الأكثر ، لأنه: إذا كان F (Origin) يمثل عدد البايتات في النص الأصلي ، يتم استخدام F (تبقى)
الجدول الباقي ، ثم
F (تبقى) = F (Origin) mod 3 تم تأسيسها.
لذلك ، فإن القيم المحتملة لـ F (تبقى) هي 0 ، 1 ، 2.
إذا n = [f (Origin) f (تبقى)] / 3
عندما يكون f (تبقى) = 0 ، يتم تحويله إلى 4*n bytes base64 الترميز.
عندما يكون f (تبقى) = 1 ، حيث يمكن تقسيم البايت الحرفي إلى بايتات مشفرة base64 ، من أجل ذلك
دع BASE64 تشفير يكون مضاعفًا من 4 ، لذلك يجب استكماله مع 2 علامتين متساويتين.
عندما تبقى (تبقى) = 2 ، حيث يمكن تقسيم بايت النص الأصلي إلى 3 بايتات مصفولة بأساس 64 ، وبالمثل ،
يجب إضافة علامة متساوية.
Base64 سيكون هناك 0 إلى 2 علامات متساوية في نهاية السلسلة المشفرة. هذه العلامات المتساوية ليست ضرورية لفك تشفيرها ، بحيث يمكن حذفها.
عندما يتم إدراج قوائم المعلمة GET و POST ، لا يمكن نقل "+" بشكل طبيعي ، بحيث يمكنك استبدالها بـ "|"
وبهذه الطريقة ، فإن الأوتار المشفرة بواسطة BASE64 لها فقط "|" و "/" ، لذلك يمكن نقل السلاسل المشفرة BASE64 كقوائم المعلمات مع قيم المعلمة
================================================================================================
فيما يلي تطبيق كتبه الأجانب:
حزمة com.meterware.httpunit ؛
/********************************************************************************************************
* $ ID: BASE64.JAVA ، V 1.4 2002/12/24 15:17:17 Russgold exp $
*
* حقوق الطبع والنشر (C) 2000-2002 بواسطة Russell Gold
*
* يتم منح إذن ، مجانًا ، لأي شخص يحصل على نسخة من هذا البرنامج ومرتبطه
* ملفات الوثائق ("البرنامج") ، للتعامل في البرنامج دون قيود ، بما في ذلك على سبيل المثال لا الحصر
* حقوق استخدام ونسخ وتعديل ودمج ونشر وتوزيع و/أو بيع نسخ من البرنامج ،
* السماح للأشخاص الذين يتم تقديم البرنامج لهم للقيام بذلك ، مع مراعاة الشروط التالية:
*
* يجب إدراج إشعار حقوق الطبع والنشر أعلاه ويجب تضمين إشعار الإذن هذا في جميع النسخ أو الأجزاء الكبيرة
* من البرنامج.
*
* يتم توفير البرنامج "كما هو" ، دون ضمان من أي نوع ، صريح أو ضمني ، بما في ذلك على سبيل المثال لا الحصر
* ضمانات القابلية للتسويق واللياقة لغرض معين وعدم الانفجارات. بأي حال من الأحوال يجب
* يتحمل المؤلفون أو حاملي حقوق الطبع والنشر مسؤولية أي مطالبة أو أضرار أو مسؤولية أخرى ، سواء في إجراء
* التعاقد أو الضرر أو غير ذلك ، الناشئة عن أو خارج أو فيما يتعلق بالبرنامج أو الاستخدام أو غيره
* تعامل في البرنامج.
*
*************************************************************************************************************
/**
* فئة الأداة المساعدة للتحويل من وإلى قاعدة 64 ترميز.
*
* author <a href = "mailto: [email protected]"> Russell Gold </a>
**/
public class base64 {Final Static String chigodingchar = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/" ؛ /*** إرجاع القاعدة 64 المكافئة المشفرة لسلسلة مزودة. * param source السلسلة لتشفير */ public static string encode (مصدر السلسلة) {char [] sourceBytes = getPaddedBytes (Source) ؛ int numgroups = (sourceBytes.length + 2) / 3 ؛ char [] targetBytes = new Char [4] ؛ char [] target = new char [4 * numGroups] ؛ لـ (int group = 0 ؛ group <numGroups ؛ Group ++) {convert3to4 (sourceBytes ، Group*3 ، TargetBytes) ؛ لـ (int i = 0 ؛ i <TargetBytes.length ؛ i ++) {target [i+4*group] = charsodingchar.charat (targetBytes [i]) ؛ }} int numpadbytes = sourceBytes.length - source.length () ؛ لـ (int i = target.length-numpadbytes ؛ i <target.length ؛ i ++) target [i] = '=' ؛ إرجاع سلسلة جديدة (الهدف) ؛ } char static char [] getPaddedBytes (مصدر السلسلة) {char [] convertted = source.tochararray () ؛ int intedlength = 3 * ((contcted.length+2) /3) ؛ char [] النتيجة = new char [requiredLength] ؛ System.ArrayCopy (تم تحويله ، 0 ، نتيجة ، 0 ، contcted.length) ؛ نتيجة العودة } private static void convert3to4 (char [] source ، int sourceIndex ، char [] target) {target [0] = (char) (source [sourceIndex] >>> 2) ؛ Target [1] = (char) ((Source [sourceIndex] & 0x03) <<4) | (source [sourceIndex+1]>> 4)) ؛ Target [2] = (char) ((Source [sourceIndex+1] & 0x0F) <<2) | (SourceIndex+2]>> 6)) ؛ Target [3] = (char) (source [sourceIndex+2] & 0x3F) ؛ } /*** إرجاع ما يعادل النص العادي لسلسلة قاعدة 64 مشفرة. * param source سلسلة 64 (التي يجب أن تحتوي على مضاعفات من 4 أحرف) */ decode السلسلة الثابتة العامة (مصدر السلسلة) {if (source.length () ٪ 4! = 0) رمي RunTimeException جديد ("رموز BASE64 صالحة لها مضاعف من 4 أحرف") ؛ int numgroups = source.length () / 4 ؛ int numExtraBytes = source.endswith ("==")؟ 2: (source.endswith ("=")؟ 1: 0) ؛ byte [] targetBytes = new byte [3*numGroups] ؛ byte [] sourceBytes = new byte [4] ؛ لـ (int group = 0 ؛ group <numGroups ؛ Group ++) {for (int i = 0 ؛ i <sourceBytes.length ؛ i ++) {sourceBytes [i] = (byte) math.max (0 ، encodingchar.indexof (source.charat (4*i))) ؛ } convert4To3 (sourceBytes ، TargetBytes ، Group*3) ؛ } إرجاع سلسلة جديدة (TargetBytes ، 0 ، TargetBytes.Length - numExtraBytes) ؛ } private static void convert4to3 (byte [] source ، byte [] target ، int targetIndex) {target [targetIndex] = (byte) ((source [0] <<2) | (source [1]>> 4)) ؛ Target [TargetIndex+1] = (byte) ((Source [1] & 0x0f) <<4) | (Source [2]>> 2)) ؛ Target [targetIndex+2] = (byte) ((Source [2] & 0x03) <<6) | (Source [3])) ؛ }}