ترميز Java و JavaScript Base64
عند تطوير تطبيقات الويب Java ، يمكنك استخدام Java لتنفيذ ترميز BASE64 على جانب الخادم ، وفك تشفيره في JavaScript على جانب العميل. وهذا يتطلب أن تكون آليات الترميز BASE64 على كلا الجانبين متسقة.
قد يواجه استخدام الترميز BASE64 مواقف غريبة مختلفة ، وحتى يشتبه في وجود أخطاء في الترميز. ولكن في الواقع ، هذا ليس هو الحال. الكائن الذي يعمل BASE64 من الناحية النظرية ليس سلسلة ولكن صفيف بايت. يتمثل مبدأها في تقليل 255 حرفًا من رمز ASCII الذي سيتم التعبير عنه في 64. على وجه التحديد ، يتم تمثيل البايتات الثلاثة الأصلية بأربعة بايت ، ويزيد الطول إلى حد ما بعد الترميز.
1) من الأفضل الترميز مرة واحدة لتجنب الترميز المجزأة. من الضروري بالفعل تشفير الترميز المجزأة. يجب أن يكون عدد البايتات في كل قطعة مضاعفات 3.
بالنسبة لتيارات البايت الطويلة ، إذا كنت ترغب في الترميز أثناء القراءة ، يجب أن يكون كل جزء مضاعفًا من 3 ، وإلا فقد يسبب الفوضى أثناء الترميم. يحب معظم الناس استخدام مضاعفات 2 لتحديد صفيف ، مثل البايت [1024] ، لأنه ليس مضاعفًا من 3 ، قد يحدث خطأ أثناء الترميم. المثال الصحيح هو:
Byte [] BS = New Byte [3*100] .... inputStream.Read (BS) .. encode (BS) ...
بالنسبة للسلاسل ، يلزم التشفير بأكمله عمومًا لتجنب أخطاء الترميز المجزأة.
بالطبع ، إذا قمت بالترميز في الأجزاء واستعادتها واحدة تلو الأخرى ، فلا توجد مشكلة.
2) تأكد من استعادة السلسلة وفقًا للترميز الأصلي عند استعادة السلسلة.
نظرًا لأنه يعمل على صفائف البايت ، فإن النتائج مختلفة بالنسبة للأحرف الصينية المشفرة GBK والأحرف الصينية المصفرة بـ UTF-8 بعد ترميز BASE64. على سبيل المثال ، إذا كانت كلمة "WE" هي رمز GBK ، فسيكون ZTLDXW == بعد تحويلها إلى BASE64 ؛ إذا كان رمز UTF-8 ، فسيكون 5OIR5Lus بعد تحويله إلى BASE64.
هذا هو "نحن" ==》 getBytes ("GBK") ==> base64
إذن ما هو الترميز المستخدم لتحويل Java وما هو الترميز المستخدم لاستعادة JavaScript. لضمان أن يكون Java و JavaScript عالميين ، نستخدم ترميز Unicode (من غير المريح تحويل JavaScript إلى UTF-8 و GBK ، لذلك نستخدم ترميز Unicode الخاص به). التفاصيل كما يلي:
جانب الخادم:
1) استخدم getBytes ("Unicode") لتحويله إلى صفيف بايت Unicode.
2) تشفير سلسلة base64
3) نقل إلى العميل
عميل:
1) تم فك تشفير BASE64 في صفيف البايت
2) اضغط على Unicode لاستعادة
الرمز كما يلي (انظر المرفق للوظائف ذات الصلة):
BASE64.ENCODE (البيانات ، "Unicode") ؛ // جافا نهاية الترميز
decode64 (البيانات) ؛ // فك تشفير JavaScript
المرفق 1: Base64 الترميز في Java
حزمة websharp.util ؛ public class base64 {private static final byte [] chigodingTable = {(byte) 'a' ، (byte) 'b' ، (byte) 'c' ، (byte) 'd' ، (byte) 'e' ، (byte) 'f' ، (byte) 'g' ، (byte) 'h' ، (byte) 'i' ، 'l' ، (byte) 'm' ، (byte) 'n' ، (byte) 'o' ، (byte) 'p' ، (byte) 'q' ، (byte) 'r' ، (byte) 's' ، (byte) 't' ، (byte) ، (y '، (byte) ، (y) ، (y) ، (byte) ، (y) ، (byte) 'a' ، (byte) 'b' ، (byte) 'c' ، (byte) 'd' ، (byte) 'e' ، (byte) 'f' ، (byte) 'g' ، (byte) 'h' ، (byte) 'i' ، (byte) 'j' ، (byte) 'k' ، (byte) 'l' ، (byte) ، (m) ، (m) ، (m) ، "o '، (byte)' p '، (byte)' q '، (byte)' r '، (byte)' s '، (byte)' t '، (byte)' u '، (byte)' v '، (byte)' w '، (byte)' x '، (byte)' y '، (byte)' ، (byte) '، 1' ، 1 ') (byte) '3' ، (byte) '4' ، (byte) '5' ، (byte) '6' ، (byte) '7' ، (byte) '8' ، (byte) '9' ، (byte) '+' ، (byte) '/'} ؛ بايت نهائي ثابت خاص [] decodingTable ؛ ثابت {decodingTable = New Byte [128] ؛ لـ (int i = 0 ؛ i <128 ؛ i ++) {decodingTable [i] = (byte) -1 ؛ } لـ (int i = 'a' ؛ i <= 'z' ؛ i ++) {decodingTable [i] = (byte) (i - 'a') ؛ } لـ (int i = 'a' ؛ i <= 'z' ؛ i ++) {decodingTable [i] = (byte) (i - 'a'+26) ؛ } لـ (int i = '0' ؛ i <= '9' ؛ i ++) {decodingTable [i] = (byte) (i - '0'+52) ؛ } decodingTable ['+'] = 62 ؛ decodingTable ['/'] = 63 ؛ } public static byte [] encode (byte [] data ، int indust) {byte [] bytes ؛ int realcount = data.length offset ؛ int معامل = realcount ٪ 3 ؛ if (modulus == 0) {bytes = new byte [(4 * RealCount) / 3] ؛ } آخر {bytes = new byte [4 * ((RealCount / 3) + 1)] ؛ } int datalength = (data.length - modulus) ؛ int A1 ؛ int A2 ؛ int A3 ؛ من أجل (int i = offset ، j = 0 ؛ i <datalength ؛ i += 3 ، j += 4) {a1 = data [i] & 0xff ؛ A2 = البيانات [i + 1] & 0xff ؛ A3 = البيانات [i + 2] & 0xff ؛ Bytes [j] = encodingTable [(a1 >>> 2) & 0x3f] ؛ Bytes [j + 1] = encodingTable [((a1 << 4) | (a2 >>> 4)) & 0x3f] ؛ Bytes [j + 2] = encodingTable [((a2 << 2) | (a3 >>> 6)) & 0x3f] ؛ Bytes [j + 3] = encodingTable [a3 & 0x3f] ؛ } int b1 ؛ int B2 ؛ int B3 ؛ int D1 ؛ int d2 ؛ التبديل (معامل) {case 0: / * لم يتبق شيء للقيام به * / break ؛ الحالة 1: d1 = data.length - 1] & 0xff ؛ B1 = (D1 >>> 2) & 0x3f ؛ B2 = (D1 << 4) & 0x3f ؛ Bytes [bytes.length - 4] = encodingTable [b1] ؛ Bytes [bytes.length - 3] = encodingTable [b2] ؛ Bytes [bytes.length - 2] = (byte) '=' ؛ Bytes [bytes.length - 1] = (byte) '=' ؛ استراحة؛ الحالة 2: D1 = Data.length - 2] & 0xff ؛ d2 = data [data.length - 1] & 0xff ؛ B1 = (D1 >>> 2) & 0x3f ؛ B2 = ((D1 << 4) | (D2 >>> 4)) & 0x3f ؛ B3 = (D2 << 2) & 0x3f ؛ Bytes [bytes.length - 4] = encodingTable [b1] ؛ Bytes [bytes.length - 3] = encodingTable [b2] ؛ Bytes [bytes.length - 2] = encodingTable [b3] ؛ Bytes [bytes.length - 1] = (byte) '=' ؛ استراحة؛ } إرجاع بايت ؛ } decode static byte [] decode (byte [] data) {byte [] bytes ؛ بايت B1 ؛ البايت B2 ؛ البايت B3 ؛ بايت B4 ؛ البيانات = discardnonbase64bytes (البيانات) ؛ if (data.length - 2] == '=') {bytes = new byte [(((data.length / 4) - 1) * 3) + 1] ؛ } آخر إذا (data.length - 1] == '=') {bytes = new byte [(((data.length / 4) - 1) * 3) + 2] ؛ } آخر {bytes = new byte [((data.length / 4) * 3)] ؛ } لـ (int i = 0 ، j = 0 ؛ i <(data.length - 4) ؛ i += 4 ، j += 3) {b1 = decodingTable [data [i]] ؛ b2 = decodingTable [data [i + 1]] ؛ b3 = decodingTable [data [i + 2]] ؛ B4 = decodingTable [البيانات [i + 3]] ؛ Bytes [j] = (byte) ((b1 << 2) | (b2 >> 4)) ؛ Bytes [j + 1] = (byte) ((b2 << 4) | (b3 >> 2)) ؛ Bytes [j + 2] = (byte) ((b3 << 6) | b4) ؛ } if (data [data.length - 2] = '=') {b1 = decodingTable [data.length - 4]] ؛ b2 = decodingTable [data.length - 3]] ؛ bytes [bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4)) ؛ } آخر إذا (data.length - 1] == '=') {b1 = decodingTable [data.length - 4]] ؛ b2 = decodingTable [data.length - 3]] ؛ b3 = decodingTable [data.length - 2]] ؛ Bytes [bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4)) ؛ bytes [bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2)) ؛ } آخر {b1 = decodingTable [data.length - 4]] ؛ b2 = decodingTable [data.length - 3]] ؛ b3 = decodingTable [data.length - 2]] ؛ b4 = decodingTable [data.length - 1]] ؛ bytes [bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4)) ؛ bytes [bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2)) ؛ Bytes [bytes.length - 1] = (byte) ((b3 << 6) | b4) ؛ } إرجاع بايت ؛ } public static byte [] decode (string data) {byte [] byte b1 ؛ البايت B2 ؛ البايت B3 ؛ بايت B4 ؛ Data = DiscardNonBase64Chars (Data) ؛ if (data.charat (data.length () - 2) == '=') {bytes = new byte [(((data.length () / 4) - 1) * 3) + 1] ؛ } آخر إذا (data.charat (data.length () - 1) == '=') {bytes = new byte [(((data.length () / 4) - 1) * 3) + 2] ؛ } آخر {bytes = new byte [((data.length ()) / 4) * 3)] ؛ } لـ (int i = 0 ، j = 0 ؛ i <(data.length () - 4) ؛ i += 4 ، j += 3) {b1 = decodingTable [data.charat (i)] ؛ b2 = decodingTable [data.charat (i + 1)] ؛ b3 = decodingTable [data.charat (i + 2)] ؛ b4 = decodingTable [data.charat (i + 3)] ؛ Bytes [j] = (byte) ((b1 << 2) | (b2 >> 4)) ؛ Bytes [j + 1] = (byte) ((b2 << 4) | (b3 >> 2)) ؛ Bytes [j + 2] = (byte) ((b3 << 6) | b4) ؛ } if (data.charat (data.length () - 2) == '=') {b1 = decodingTable [data.charat (data.length () - 4)] ؛ b2 = decodingTable [data.charat (data.length () - 3)] ؛ bytes [bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4)) ؛ } آخر if (data.charat (data.length () - 1) == '=') {b1 = decodingTable [data.charat (data.length () - 4)] ؛ b2 = decodingTable [data.charat (data.length () - 3)] ؛ b3 = decodingTable [data.charat (data.length () - 2)] ؛ Bytes [bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4)) ؛ bytes [bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2)) ؛ } آخر {b1 = decodingTable [data.charat (data.length () - 4)] ؛ b2 = decodingTable [data.charat (data.length () - 3)] ؛ b3 = decodingTable [data.charat (data.length () - 2)] ؛ b4 = decodingTable [data.charat (data.length () - 1)] ؛ bytes [bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4)) ؛ bytes [bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2)) ؛ Bytes [bytes.length - 1] = (byte) ((b3 << 6) | b4) ؛ } لـ (int i = 0 ؛ i <bytes.length ؛ i ++) system.out.println ("،"+bytes [i]) ؛ إرجاع بايت. } بايت ثابت خاص [] discardnonbase64bytes (byte [] data) {byte [] temp = new byte [data.length] ؛ int bytescopied = 0 ؛ لـ (int i = 0 ؛ i <data.length ؛ i ++) {if (isValidBase64Byte (data [i])) {temp [bytescopied ++] = data [i] ؛ }} byte [] newData = new byte [bytescopied] ؛ System.ArrayCopy (temp ، 0 ، NewData ، 0 ، bytescopied) ؛ إرجاع Newdata ؛ } سلسلة ثابتة خاصة decardnonbase64chars (بيانات السلسلة) {StringBuffer SB = new StringBuffer () ؛ طول int = data.length () ؛ لـ (int i = 0 ؛ i <length ؛ i ++) {if (isValidBase64Byte ((byte) (data.charat (i)))) {sb.append (data.charat (i)) ؛ }} return sb.toString () ؛ } isvalidbase64byte isvalidbase64byte ثابتة ثابتة (بايت ب) {if (b == '=') {return true ؛ } آخر إذا ((b <0) || (b> = 128)) {return false ؛ } آخر إذا (decodingTable [b] == -1) {return false ؛ } إعادة صواب ؛ } تشفير السلسلة الثابتة العامة (بيانات السلسلة ، سلسلة charset) يلقي الاستثناء {// byte [] result = (data.getBytes ("unicode")) ؛ if (data == null || data.length () == 0) return data ؛ int الإزاحة = 0 ؛ // بعد تشغيل getSbytes ("Unicode") ، ستتم إضافة بايتان "Fe" إلى البايت الأمامي [] result = encode (data.getBytes (charset) ، الإزاحة) ؛ StringBuffer SB = New StringBuffer (result.length) ؛ لـ (int i = 0 ؛ i <result.length ؛ i ++) sb.append ((char) result [i]) ؛ إرجاع sb.tostring () ؛ } decode static static static (بيانات السلسلة ، سلسلة charset) يلقي استثناء {if (data == null || data.length () == 0) بيانات الإرجاع ؛ إرجاع سلسلة جديدة (BASE64.Decode (DATA) ، Charset) ؛ } public static void main (string [] args) يلقي الاستثناء {string data = "we" ؛ String Data1 = encode (البيانات ، "Unicode") ؛ String Data2 = Decode (Data1 ، "Unicode") ؛ system.out.println (data) ؛ system.out.println (data1) ؛ system.out.println (data2) ؛ }} التذييل 2: ترميز BASE64 في JavaScript
<html> <Head> <title> base64 الترميز/فك التشفير </title> </head> <script type = "text/javaScript"> <!- var keystt = "abcdefghijklmnop" + "wxysuvwxyzabcdef" + "ghijklmnopqrstuvuv "=" ؛ وظيفة encode64 (الإدخال) {input = UnicodetObytes (input) ؛ var output = "" ؛ var chr1 ، chr2 ، chr3 = "" ؛ var enc1 ، enc2 ، enc3 ، enc4 = "" ؛ var i = 0 ؛ do {chr1 = input [i ++] ؛ chr2 = الإدخال [i ++] ؛ chr3 = الإدخال [i ++] ؛ enc1 = chr1 >> 2 ؛ ENC2 = ((Chr1 & 3) << 4) | (Chr2 >> 4) ؛ ENC3 = ((Chr2 & 15) << 2) | (Chr3 >> 6) ؛ ENC4 = Chr3 & 63 ؛ if (isnan (chr2)) {enc3 = enc4 = 64 ؛ } آخر إذا (isnan (chr3)) {enc4 = 64 ؛ } الإخراج = الإخراج + KeyStr.charat (enc1) + KeyStr.charat (ENC2) + KeyStr.charat (ENC3) + KeyStr.charat (ENC4) ؛ chr1 = chr2 = chr3 = "" ؛ ENC1 = ENC2 = ENC3 = ENC4 = "" ؛ } بينما (i <input.length) ؛ إرجاع الإرجاع ؛ } دالة decode64 (الإدخال) {var output = "" ؛ var chr1 ، chr2 ، chr3 = "" ؛ var enc1 ، enc2 ، enc3 ، enc4 = "" ؛ var i = 0 ؛ // قم بإزالة جميع الأحرف التي ليست AZ ، AZ ، 0-9 ، +،/، أو = var base64test =/[^a-za-z0-9/ +/// =]/g ؛ if (base64test.exec (input)) {Alert ("كانت هناك أحرف قاعدة 64 غير صالحة في نص الإدخال. } input = input.replace (/[^a-za-z0-9/+/// =]/g ، "") ؛ الإخراج = صفيف جديد () ؛ do {enc1 = KeyStr.Indexof (input.charat (i ++)) ؛ enc2 = keystr.indexof (input.charat (i ++)) ؛ enc3 = keysttr.indexof (input.charat (i ++)) ؛ enc4 = keystr.indexof (input.charat (i ++)) ؛ Chr1 = (Enc1 << 2) | (ENC2 >> 4) ؛ Chr2 = ((Enc2 & 15) << 4) | (ENC3 >> 2) ؛ Chr3 = ((ENC3 و 3) << 6) | ENC4 ؛ output.push (chr1) ؛ if (enc3! = 64) {output.push (chr2) ؛ } if (enc4! = 64) {output.push (chr3) ؛ } chr1 = chr2 = chr3 = "" ؛ ENC1 = ENC2 = ENC3 = ENC4 = "" ؛ } بينما (i <input.length) ؛ إرجاع bytestounicode (الإخراج) ؛ } وظيفة UnicodetObytes (s) {var result = new array () ؛ if (s == null || s == "") نتيجة الإرجاع ؛ النتيجة. push (255) ؛ // إضافة "fe" إلى رأس النتيجة. push (254) ؛ لـ (var i = 0 ؛ i <s.length ؛ i ++) {var c = s.charcodeat (i) .ToString (16) ؛ if (c.length == 1) i = "000"+c ؛ آخر إذا (c.length == 2) c = "00"+c ؛ آخر إذا (c.length == 3) c = "0"+c ؛ var var1 = parseint (c.substring (2) ، 16) ؛ var var2 = parseint (c.substring (0،2) ، 16) ؛ result.push (var1) ؛ result.push (var2) ؛ } نتيجة الإرجاع ؛ } وظيفة bytestounicode (bs) {var result = "" ؛ var offset = 0 ؛ if (bs.length> = 2 && bs [0] == 255 && bs [1] == 254) الإزاحة = 2 ؛ // حذف "fe" لـ (var i = offset ؛ i <bs.length ؛ i+= 2) {var code = bs [i]+(bs [i+1] << 8) ؛ النتيجة+= string.fromcharcode (رمز) ؛ } نتيجة الإرجاع ؛ } //-> </script> <body> <form name = "base64form"> اكتب في الرسالة التي تريد تشفيرها في base64 ، أو لصق <br> base64 النص المشفر في حقل النص ، حدد الترميز أو فك التشفير ، <br> وانقر فوق الزر! name = "encode" value = "encode to base64" onClick = "document.base64form.thetext.value = encode64 (document.base64form.thetext.value) ؛ onClick = "document.base64form.thetext.value = decode64 (document.base64form.thetext.value) ؛شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!