Java und Javascript Base64 Codierung
Bei der Entwicklung von Java -Webanwendungen können Sie Java verwenden, um Base64 -Codierung auf der Serverseite durchzuführen und auf der Client -Seite in JavaScript zu dekodieren. Dies erfordert, dass die Base64 -Codierungsmechanismen auf beiden Seiten konsistent sind.
Die Verwendung von Base64 -Codierung kann auf verschiedene seltsame Situationen stoßen und sogar vermutet, dass die Codierung Fehler aufweist. In der Tat ist dies jedoch nicht der Fall. Das Objekt, das Base64 theoretisch arbeitet, ist keine Zeichenfolge, sondern ein Byte -Array. Sein Prinzip besteht darin, die in 64 ausgedrückten 255 Zeichen des ASCII -Code zu reduzieren. Insbesondere werden die ursprünglichen drei Bytes durch vier Bytes dargestellt, und die Länge steigt nach der Codierung bis zu einem gewissen Grad.
1) Es ist am besten, gleichzeitig zu codieren, um eine segmentierte Codierung zu vermeiden. Es ist in der Tat notwendig, segmentierte Codierung zu codieren. Die Anzahl der Bytes in jedem Segment sollte ein Vielfaches von 3 sein.
Bei langen Byte -Streams muss jedes Segment ein Vielfaches von 3 sein, sonst kann es während der Restaurierung Chaos verursachen. Die meisten Menschen verwenden gerne die Multiplikatoren von 2, um ein Array wie Byte [1024] zu definieren, da es sich nicht um ein Vielfaches von 3 handelt, ein Fehler kann während der Wiederherstellung auftreten. Das richtige Beispiel ist:
byte [] bs = neues byte [3*100] .... InputStream.read (bs) .. codieren (bs) ...
Für Zeichenfolgen ist die gesamte Codierung im Allgemeinen erforderlich, um segmentierte Codierungsfehler zu vermeiden.
Wenn Sie in Segmenten codieren und einzeln wiederherstellen, gibt es kein Problem.
2) Stellen Sie sicher, dass die Zeichenfolge bei der Wiederherstellung der Zeichenfolge gemäß der ursprünglichen Codierung wiederhergestellt wird.
Da es in Byte-Arrays arbeitet, unterscheiden sich die Ergebnisse für GBK-kodierte chinesische Zeichen und UTF-8-kodierte chinesische Zeichen nach Base64-Codierung. Wenn das Wort "We" beispielsweise GBK -Code ist, wird es ztldxw ==, nachdem er in Base64 konvertiert wurde. Wenn es sich um einen UTF-8-Code handelt, wird er 5OIR5LUS sein, nachdem er in Base64 konvertiert wurde.
Das ist "us" ==》 getBytes ("gbk") ==> Base64
Mit welcher Codierung wird Java und mit welcher Codierung JavaScript wiederhergestellt werden. Um sicherzustellen, dass Java und JavaScript universell sind, verwenden wir Unicode-Codierung (es ist unpraktisch, JavaScript in UTF-8 und GBK umzuwandeln, sodass wir eine eigene Unicode-Codierung verwenden). Die Details sind wie folgt:
Serverseite:
1) Verwenden Sie GetBytes ("Unicode"), um es in ein Unicode -Byte -Array umzuwandeln.
2) In Base64 String codieren
3) Übertragen Sie zum Kunden
Kunde:
1) Base64 wird in Byte -Array dekodiert
2) Drücken Sie Unicode, um wiederherzustellen
Der Code ist wie folgt (siehe Anhang für zugehörige Funktionen):
Base64.Encode (Daten, "Unicode"); // Java End -Codierung
Decode64 (Daten); // JavaScript Decodierung
Anhang 1: Base64 -Codierung in Java
Paket websharp.util; public class base64 {private statische endgültige Byte [] codingTable = {(byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' 'L', (byte) 'm', (byte) 'n', (byte) 'o', (byte) 'p', (byte) 'q', (byte) 'r', (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) '/'}; privates statisches Final -Byte [] decodingtable; static {decodingtable = new Byte [128]; für (int i = 0; i <128; i ++) {decodingTable [i] = (byte) -1; } für (int i = 'a'; i <= 'z'; i ++) {decodingTable [i] = (byte) (i - 'a'); } für (int i = 'a'; i <= 'z'; i ++) {decodiTable [i] = (byte) (i - 'a'+26); } für (int i = '0'; i <= '9'; i ++) {decodiTable [i] = (byte) (i - '0'+52); } decodingTable ['+'] = 62; decodingTable ['/'] = 63; } public static byte [] codieren (byte [] data, int offset) {byte [] bytes; int realcount = data.length-offset; int modulus = realcount % 3; if (modulus == 0) {bytes = new byte [(4 * realCount) / 3]; } else {bytes = new byte [4 * ((realCount / 3) + 1)]; } int datalength = (data.length - modulus); int a1; int a2; int a3; für (int i = offset, j = 0; i <datalength; i += 3, j += 4) {a1 = data [i] & 0xff; A2 = Daten [i + 1] & 0xff; A3 = Daten [i + 2] & 0xff; Bytes [j] = codintable [(a1 >>> 2) & 0x3f]; Bytes [j + 1] = codintable [(a1 << 4) | (a2 >>> 4)) & 0x3f]; Bytes [j + 2] = codintable [((a2 << 2) | (a3 >>> 6)) & 0x3f]; Bytes [j + 3] = codiert werden [A3 & 0x3f]; } int b1; int B2; int b3; int d1; int d2; Switch (modulus) {case 0: / * Nichts übrig zu tun * / break; Fall 1: D1 = Daten [Daten.Length - 1] & 0xff; B1 = (D1 >>> 2) & 0x3f; B2 = (d1 << 4) & 0x3f; Bytes [Bytes.Length - 4] = codintable [B1]; Bytes [Bytes.Length - 3] = codintable [b2]; bytes [bytes.length - 2] = (byte) '='; bytes [bytes.length - 1] = (byte) '='; brechen; Fall 2: D1 = Daten [Daten.Length - 2] & 0xff; D2 = Daten [Daten.Length - 1] & 0xff; B1 = (D1 >>> 2) & 0x3f; B2 = ((d1 << 4) | (d2 >>> 4)) & 0x3f; b3 = (d2 << 2) & 0x3f; Bytes [Bytes.Length - 4] = codintable [B1]; Bytes [Bytes.Length - 3] = codintable [b2]; Bytes [Bytes.Length - 2] = codintable [b3]; bytes [bytes.length - 1] = (byte) '='; brechen; } return bytes; } public static byte [] decode (byte [] data) {byte [] bytes; Byte B1; Byte B2; Byte B3; Byte B4; Data = DefardNonBase64Bytes (Daten); if (data [data.length - 2] == '=') {bytes = new Byte [((data.length / 4) - 1) * 3) + 1]; } else if (data [data.length - 1] == '=') {bytes = new Byte [((Daten.Length / 4) - 1) * 3) + 2]; } else {bytes = new Byte [(data.length / 4) * 3)]; } für (int i = 0, j = 0; i <(Data.Length - 4); i += 4, j += 3) {b1 = decodiTable [data [i]]; B2 = decodiTTable [Daten [i + 1]]; b3 = decodiktable [Daten [i + 2]]; b4 = decodingTable [Daten [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 = decodiTTable [Daten [Daten.Length - 3]]; bytes [bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4)); } else if (data [data.length - 1] == '=') {b1 = decodiNtable [data.Length - 4]]; B2 = decodiTTable [Daten [Daten.Length - 3]]; B3 = decodiTTable [Daten [Daten.Length - 2]]; bytes [bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4)); bytes [bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2)); } else {b1 = decodingTable [data.Length - 4]]; B2 = decodiTTable [Daten [Daten.Length - 3]]; B3 = decodiTTable [Daten [Daten.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); } return bytes; } public static byte [] decode (String -Daten) {Byte [] Byte B1; Byte B2; Byte B3; Byte B4; Data = DefardNonBase64Chars (Daten); if (data.charat (data.length () - 2) == '=') {bytes = new byte [((data.length () / 4) - 1) * 3) + 1]; } else if (data.charat (data.length () - 1) == '=') {bytes = new byte [((data.length () / 4) - 1) * 3) + 2]; } else {bytes = new byte [(data.length ()) / 4) * 3)]; } für (int i = 0, j = 0; i <(Data.Length () - 4); i += 4, j += 3) {b1 = decodingTable [data.charat (i)]; B2 = decodiTTable [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 = decodiTTable [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 = decodiTTable [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 = decodiTTable [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); } für (int i = 0; i <bytes.length; i ++) system.out.println (","+bytes [i]); Rückkehr Bytes; } private static byte [] entfaltnonbase64Bytes (byte [] data) {byte [] temp = new Byte [data.length]; int bytescopied = 0; für (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); Neudata zurückgeben; } private statische String DefardNonBase64Char (String Data) {stringBuffer sb = new StringBuffer (); int länge = data.length (); für (int i = 0; i <länge; i ++) {if (isvalidbase64Byte ((byte) (data.charat (i))) {sb.append (data.charat (i)); }} return sb.toString (); } private statische boolean isvalidbase64Byte (Byte b) {if (b == '=') {return true; } else if ((b <0) || (b> = 128)) {return false; } else if (decodiTable [b] == -1) {return false; } Return true; } public static String Encodes (String -Daten, String charSet) löst Ausnahme aus {// byte [] result = (data.getBytes ("unicode")); if (data == null || data.length () == 0) Rückgabedaten; int offset = 0; // Nach dem Erhalten von Bytes ("Unicode") werden zwei Bytes "Fe" dem vorderen Byte [] result = codes (Data.getBytes (charSet), Offset) hinzugefügt; StringBuffer sb = new StringBuffer (result.Length); für (int i = 0; i <result.length; i ++) sb.Append ((char) result [i]); return sb.tostring (); } public static String decode (String Data, String charSet) löst die Ausnahme aus {if (data == null || data.length () == 0) Returndaten; Neue String zurückgeben (Base64.Decode (Daten), charSet); } public static void main (String [] args) löst eine Ausnahme aus {String data = "We"; String data1 = codieren (Daten, "Unicode"); String data2 = decode (data1, "unicode"); System.out.println (Daten); System.out.println (Data1); System.out.println (Data2); }} Anhang 2: Base64 -Codierung in JavaScript
<html> <head> <title>base64 Encoding/Decoding</title> </head> <script type="text/javascript"><!-- var keyStr = "ABCDEFGHIJKLMNOP" + "QRSTUVWXYZabcdef" + "ghijklmnopqrstuv" + "wxyz0123456789+/" + "="; Funktion codieren64 (input) {input = unicodetobytes (input); var output = ""; var chr1, chr2, chr3 = ""; var ENC1, ENC2, ENC3, ENC4 = ""; var i = 0; do {chr1 = input [i ++]; chr2 = Eingabe [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); Rückgabeausgabe; } Funktion decodode64 (input) {var output = ""; var chr1, chr2, chr3 = ""; var ENC1, ENC2, ENC3, ENC4 = ""; var i = 0; // Entfernen Sie alle Zeichen, die nicht az, az, 0-9, +,/oder = var base64Test =/[^a-za-z0-9/ +/// =]/g; if (Base64Test.exec (input)) {alert ("Es gab ungültige Basis64-Zeichen im Eingabetxt. } input = input.replace (/[^a-za-z0-9/+/// =]/g, ""); output = new Array (); 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 (Ausgabe); } function unicodetobytes (s) {var result = new Array (); if (s == null || s == "") Rückgabeergebnis; result.push (255); // "fe" zum Kopf -Ergebnis hinzufügen.push (254); für (var i = 0; i <sength; i ++) {var c = S. charCodeat (i) .ToString (16); if (C.Length == 1) i = "000"+c; sonst if (c.Length == 2) c = "00"+c; else if (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); } Rückgabeergebnis; } function byTestounicode (bs) {var result = ""; var offset = 0; if (bs.length> = 2 && bs [0] == 255 && bs [1] == 254) offset = 2; // "Fe" für (var i = offset; i <bs.Length; i+= 2) {var code = bs [i]+(bs [i+1] << 8); Ergebnis+= string.fromCharCode (Code); } Rückgabeergebnis; } //-> </script> <body> <Formular name = "Base64Form"> Geben Sie die Nachricht ein, die Sie in Base64 codieren möchten, oder einfügen. name = "codieren" value = "codieren an base64" onclick = "document.base64Form.thetext.value = codode64 (document.base64Form.thetext.Value); onclick = "document.base64Form.thETEXT.Value = decode64 (document.base64Form.thEText.Value);"> </form> </body> </html>Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!