Java dan JavaScript Base64 Encoding
Saat mengembangkan aplikasi web Java, Anda dapat menggunakan Java untuk melakukan encoding Base64 di sisi server, dan memecahkan kode di JavaScript di sisi klien. Ini membutuhkan mekanisme pengkodean base64 di kedua sisi untuk konsisten.
Menggunakan pengkodean Base64 dapat menghadapi berbagai situasi aneh, dan bahkan menduga ada bug dalam pengkodean. Namun pada kenyataannya, ini bukan masalahnya. Objek yang dioperasikan Base64 secara teori bukanlah string tetapi array byte. Prinsipnya adalah untuk mengurangi 255 karakter kode ASCII untuk diekspresikan dalam 64. Secara khusus, tiga byte asli diwakili oleh empat byte, dan panjangnya meningkat sampai batas tertentu setelah pengkodean.
1) Yang terbaik adalah mengkodekan sekaligus untuk menghindari pengkodean tersegmentasi. Memang perlu untuk menyandikan pengkodean tersegmentasi. Jumlah byte di setiap segmen harus kelipatan 3.
Untuk aliran byte yang panjang, jika Anda ingin menyandikan saat membaca, setiap segmen harus kelipatan 3, jika tidak dapat menyebabkan kekacauan selama restorasi. Kebanyakan orang suka menggunakan pengganda 2 untuk mendefinisikan array, seperti byte [1024], karena itu bukan kelipatan 3, kesalahan dapat terjadi selama restorasi. Contoh yang benar adalah:
byte [] bs = byte baru [3*100] .... inputStream.read (bs) .. encode (bs) ...
Untuk string, seluruh pengkodean umumnya diperlukan untuk menghindari kesalahan pengkodean yang tersegmentasi.
Tentu saja, jika Anda mengkode segmen dan mengembalikannya satu per satu, tidak ada masalah.
2) Pastikan string dipulihkan sesuai dengan pengkodean asli saat memulihkan string.
Karena beroperasi pada array byte, hasilnya berbeda untuk karakter Cina yang dikodekan GBK dan karakter Cina yang dikodekan UTF-8 setelah pengkodean base64. Misalnya, jika kata "kami" adalah kode GBK, itu akan menjadi ztldxw == Setelah dikonversi ke base64; Jika kode UTF-8, itu akan menjadi 5oir5LUS setelah dikonversi ke Base64.
Itu adalah "US" ==》 getBytes ("gbk") ==> base64
Jadi penyandian apa yang digunakan untuk mengonversi Java dan penyandian apa yang digunakan untuk mengembalikan JavaScript. Untuk memastikan bahwa Java dan JavaScript bersifat universal, kami menggunakan pengkodean Unicode (tidak nyaman untuk mengonversi JavaScript menjadi UTF-8 dan GBK, jadi kami menggunakan pengkodean unicode sendiri). Dengan rincian sebagai berikut:
Sisi server:
1) Gunakan getBytes ("unicode") untuk mengubahnya menjadi array byte unicode.
2) Encode ke string base64
3) Transfer ke klien
Klien:
1) Base64 diterjemahkan menjadi array byte
2) Tekan Unicode untuk memulihkan
Kode adalah sebagai berikut (lihat lampiran untuk fungsi terkait):
Base64.encode (data, "unicode"); // Java End Encoding
decode64 (data); // decoding javascript
Lampiran 1: Base64 Pengkodean di Java
paket websharp.util; Public Class Base64 {private static final byte [] encodingtable = {(byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'f', byte) 'g', (byte) 'h', byte) 'byte) 'L', (byte) 'M', (byte) 'N', (byte) 'O', (byte) 'P', (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U', (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j', (byte) 'k', (byte) 'i', byte) 'j', (byte) 'k', (byte) 'i') 'byte)' byte) 'o', (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's', (byte) 't', (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x', (byte) 'y', (byte) 'z', (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) '+', (byte) '/'}; byte final statis pribadi [] decodingtable; static {decodingtable = byte baru [128]; untuk (int i = 0; i <128; i ++) {decodingtable [i] = (byte) -1; } untuk (int i = 'a'; i <= 'z'; i ++) {decodingtable [i] = (byte) (i - 'a'); } untuk (int i = 'a'; i <= 'z'; i ++) {decodingtable [i] = (byte) (i - 'a'+26); } untuk (int i = '0'; i <= '9'; i ++) {decodingtable [i] = (byte) (i - '0'+52); } decodingtable ['+'] = 62; decodingtable ['/'] = 63; } public static byte [] encode (byte [] data, int offset) {byte [] bytes; int realcount = data.length-offset; int modulus = realcount % 3; if (modulus == 0) {bytes = byte baru [(4 * realcount) / 3]; } else {bytes = byte baru [4 * ((realcount / 3) + 1)]; } int dataLength = (data.length - modulus); int a1; int a2; int a3; untuk (int i = offset, j = 0; i <datalength; i += 3, j += 4) {a1 = data [i] & 0xff; a2 = data [i + 1] & 0xff; A3 = Data [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; sakelar (modulus) {case 0: / * Tidak ada yang tersisa untuk dilakukan * / break; Kasus 1: D1 = Data [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) '='; merusak; Kasus 2: D1 = Data [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) '='; merusak; } return byte; } public static byte [] decode (byte [] data) {byte [] bytes; byte b1; byte b2; byte b3; byte b4; data = DiscardNonBase64Bytes (data); if (data [data.length - 2] == '=') {bytes = byte baru [(((data.length / 4) - 1) * 3) + 1]; } else if (data [data.length - 1] == '=') {bytes = byte baru [(((data.length / 4) - 1) * 3) + 2]; } else {bytes = byte baru [((data.length / 4) * 3)]; } untuk (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 [data [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 [data.length - 4]]; b2 = decodingtable [data [data.length - 3]]; bytes [bytes.length - 1] = (byte) ((B1 << 2) | (B2 >> 4)); } lain jika (data [data.length - 1] == '=') {b1 = decodingtable [data [data.length - 4]]; b2 = decodingtable [data [data.length - 3]]; b3 = decodingtable [data [data.length - 2]]; bytes [bytes.length - 2] = (byte) ((B1 << 2) | (B2 >> 4)); bytes [bytes.length - 1] = (byte) ((B2 << 4) | (B3 >> 2)); } else {b1 = decodingtable [data [data.length - 4]]; b2 = decodingtable [data [data.length - 3]]; b3 = decodingtable [data [data.length - 2]]; b4 = decodingtable [data [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); } return byte; } public static byte [] decode (string data) {byte [] byte b1; byte b2; byte b3; byte b4; data = DiscardNonBase64Chars (data); if (data.charat (data.length () - 2) == '=') {bytes = byte baru [(((data.length () / 4) - 1) * 3) + 1]; } else if if (data.charat (data.length () - 1) == '=') {bytes = byte baru [(((data.length () / 4) - 1) * 3) + 2]; } else {bytes = byte baru [((data.length ()) / 4) * 3)]; } untuk (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)); } else 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)); } else {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); } untuk (int i = 0; i <bytes.length; i ++) system.out.println (","+bytes [i]); Byte kembali; } byte statis pribadi [] DiscardNonBase64Bytes (byte [] data) {byte [] temp = byte baru [data.length]; int bytescopied = 0; untuk (int i = 0; i <data.length; i ++) {if (isValidBase64byte (data [i])) {temp [bytescopied ++] = data [i]; }} byte [] newData = byte baru [bytescopied]; System.arraycopy (temp, 0, newData, 0, bytescopied); mengembalikan newdata; } private static String DiscardNonBase64Chars (data string) {StringBuffer SB = StringBuffer baru (); int panjang = data.length (); untuk (int i = 0; i <panjang; i ++) {if (isValidBase64byte ((byte) (data.charat (i)))) {sb.append (data.charat (i)); }} return sb.toString (); } private static boolean isValidBase64byte (byte b) {if (b == '=') {return true; } else if ((b <0) || (b> = 128)) {return false; } lain jika (decodingtable [b] == -1) {return false; } return true; } public static string encode (string data, string charset) melempar pengecualian {// byte [] result = (data.getbytes ("unicode")); if (data == null || data.length () == 0) mengembalikan data; int offset = 0; // Setelah GetBytes ("Unicode") diputar, dua byte "Fe" akan ditambahkan ke byte depan [] hasil = encode (data.getbytes (charset), offset); StringBuffer SB = StringBuffer baru (result.length); untuk (int i = 0; i <result.length; i ++) sb.append ((char) hasil [i]); return sb.tostring (); } public static string decode (string data, string charset) melempar pengecualian {if (data == null || data.length () == 0) mengembalikan data; mengembalikan string baru (base64.decode (data), charset); } public static void main (string [] args) melempar pengecualian {string data = "we"; String data1 = encode (data, "unicode"); String data2 = decode (data1, "unicode"); System.out.println (data); System.out.println (data1); System.out.println (data2); }} Lampiran 2: Pengkodean Base64 dalam JavaScript
<html> <head> <title> base64 encoding/decoding </iteme> </pead> <script type = "text/javaScript"> <!- var keystr = "abcdefghijklmnop" + "qrstuVwxyzabcdef" + "ghijklmnopqrstur" wrstuvwxyzabcdef " +" ghijklmnopqrstur " +" qrstuVwxyzaBcDef " +" ghijklmnopqrstur " "="; function encode64 (input) {input = unicodetobytes (input); var output = ""; var chr1, chr2, chr3 = ""; var enc1, enc2, enc3, enc4 = ""; var i = 0; do {chr1 = input [i ++]; chr2 = input [i ++]; chr3 = input [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; } else if (isNan (chr3)) {enc4 = 64; } output = output + keystr.charat (enc1) + keystr.charat (enc2) + keystr.charat (enc3) + keystr.charat (enc4); chr1 = chr2 = chr3 = ""; ENC1 = ENC2 = ENC3 = ENC4 = ""; } while (i <input.length); output pengembalian; } function decode64 (input) {var output = ""; var chr1, chr2, chr3 = ""; var enc1, enc2, enc3, enc4 = ""; var i = 0; // Hapus semua karakter yang bukan AZ, AZ, 0-9, +,/, atau = var base64test =/[^a-za-z0-9/ +/// =]/g; if (base64test.exec (input)) {alert ("Ada karakter base64 yang tidak valid dalam teks input./n" + "Karakter base64 yang valid adalah az, az, 0-9, ' +', '/', dan '='/n" + "Harap kesalahan dalam decoding."); } input = input.replace (/[^a-za-z0-9/+/// =]/g, ""); output = array baru (); do {enc1 = keyStr.indexof (input.charat (i ++)); enc2 = keyStr.IndexOf (input.charat (i ++)); enc3 = keyStr.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 = ""; } while (i <input.length); return bytestouniCode (output); } fungsi unicodetobytes (s) {var result = array baru (); if (s == null || s == "") hasil pengembalian; Hasil.Push (255); // tambahkan "fe" ke head hasil.push (254); untuk (var i = 0; i <s.length; i ++) {var c = s.charcodeat (i) .toString (16); if (c.length == 1) i = "000"+c; lain jika (c.length == 2) c = "00"+c; lain jika (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); } hasil pengembalian; } function bytestouniCode (bs) {var result = ""; var offset = 0; if (bs.length> = 2 && bs [0] == 255 && bs [1] == 254) offset = 2; // hapus "fe" untuk (var i = offset; i <bs.length; i+= 2) {var code = bs [i]+(bs [i+1] << 8); hasil+= string.fromCharCode (kode); } hasil pengembalian; } //--> </script> <body> <form name = "base64Form"> Ketik pesan yang ingin Anda encode di base64, atau tempel <br> base64 teks yang dikodekan ke dalam bidang teks, pilih Encode atau decode, <br> dan klik tombol! <br> <textarea name = "thetext" cols = "40" Buls = "" "" "" "" "" "" " name = "encode" value = "encode ke base64" ontClick = "document.base64form.thetext.value = encode64 (document.base64Form.thetext.value);"> <input type = "Tombol" name = "decode" value = "decode dari base64" OnClick = "document.base64Form.thetext.value = decode64 (document.base64Form.thetext.value);"> </form> </body> </html>Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!