Encodage Java et JavaScript Base64
Lorsque vous développez des applications Web Java, vous pouvez utiliser Java pour effectuer un codage Base64 côté serveur et le décoder en JavaScript du côté client. Cela nécessite que les mécanismes de codage de base64 des deux côtés sont cohérents.
L'utilisation du codage de base64 peut rencontrer diverses situations étranges et soupçonnait même qu'il y a des bogues dans le codage. Mais en fait, ce n'est pas le cas. L'objet que Base64 fonctionne en théorie n'est pas une chaîne mais un tableau d'octets. Son principe est de réduire les 255 caractères du code ASCII à exprimer en 64. Plus précisément, les trois octets d'origine sont représentés par quatre octets, et la longueur augmente dans une certaine mesure après le codage.
1) Il est préférable d'encoder immédiatement pour éviter le codage segmenté. Il est en effet nécessaire de coder le codage segmenté. Le nombre d'octets dans chaque segment doit être des multiples de 3.
Pour les flux d'octets longs, si vous voulez encoder pendant la lecture, chaque segment doit être un multiple de 3, sinon il peut provoquer le chaos pendant la restauration. La plupart des gens aiment utiliser les multiplicateurs de 2 pour définir un tableau, comme l'octet [1024], car il n'est pas un multiple de 3, une erreur peut se produire pendant la restauration. Le bon exemple est:
octet [] bs = nouveau octet [3 * 100] .... inputStream.read (bs) .. Encode (BS) ...
Pour les chaînes, l'encodage entier est généralement nécessaire pour éviter les erreurs de codage segmentées.
Bien sûr, si vous codez en segments et les restaurez un par un, il n'y a pas de problème.
2) Assurez-vous que la chaîne est restaurée en fonction de l'encodage d'origine lors de la restauration de la chaîne.
Parce qu'il fonctionne sur des tableaux d'octets, les résultats sont différents pour les caractères chinois codés par GBK et les caractères chinois codés UTF-8 après le codage de la base64. Par exemple, si le mot «nous» est le code GBK, ce sera ztldxw == après avoir été converti en base64; S'il s'agit du code UTF-8, il sera 5 Ooir5lus après avoir été converti en base64.
C'est "nous" ==》 GetBytes ("gbk") ==> base64
Donc, quel codage est utilisé pour convertir Java et quel codage est utilisé pour restaurer JavaScript. Pour nous assurer que Java et JavaScript sont universels, nous utilisons le codage Unicode (il est gênant de convertir JavaScript en UTF-8 et GBK, nous utilisons donc son propre codage Unicode). Les détails sont les suivants:
Côté serveur:
1) Utilisez GetBytes ("Unicode") pour le convertir en un tableau d'octets Unicode.
2) Encoder dans la chaîne Base64
3) Transférer au client
Client:
1) Base64 est décodé en tableau d'octets
2) Appuyez sur Unicode pour restaurer
Le code est le suivant (voir la pièce jointe pour les fonctions connexes):
Base64.encode (données, "Unicode"); // Encodage de fin Java
Decode64 (données); // Décodage JavaScript
Attachement 1: Base64 Encodage en Java
package websharp.util; classe publique Base64 {octet final statique privé [] EncodingTable = {(byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f', (byte) 'g', (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' ((ate) 'a', (octet) 'b', (octet) 'c', (octet) 'd', (byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (by) 'i', (byte) 'j', (byte) 'k', (by) 'l', (byte) ' 'o', (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's', (byte) 't', (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x', (byte) '' ', (by)' z ', (byte)' 0 ' (octet) '3', (octet) '4', (octet) '5', (octet) '6', (octet) '7', (octet) '8', (octet) '9', (octet) '+', (octet) '/'}; octet final statique privé [] DecodingTable; statique {decodingTable = new octet [128]; for (int i = 0; i <128; i ++) {decodingTable [i] = (byte) -1; } pour (int i = 'a'; i <= 'z'; i ++) {decodingTable [i] = (byte) (i - 'a'); } pour (int i = 'a'; i <= 'z'; i ++) {decodingTable [i] = (byte) (i - 'a' + 26); } pour (int i = '0'; i <= '9'; i ++) {decodingTable [i] = (byte) (i - '0' + 52); } decodingTable ['+'] = 62; decodingTable ['/'] = 63; } Public Static Byte [] Encode (Byte [] Data, int offset) {octet [] octets; int realCount = data.length-offset; int module = realCount% 3; if (modulus == 0) {bytes = new byte [(4 * realCount) / 3]; } else {bytes = new byte [4 * ((realcount / 3) + 1)]; } int datalngle = (data.length - module); int a1; int a2; int a3; for (int i = offset, j = 0; i <datalngle; i + = 3, j + = 4) {a1 = data [i] & 0xff; a2 = data [i + 1] & 0xff; a3 = data [i + 2] & 0xff; Bytes [j] = EncodingTable [(a1 >>> 2) & 0x3f]; octets [J + 1] = EncodingTable [((a1 << 4) | (a2 >>> 4)) & 0x3f]; octets [j + 2] = codingTable [((a2 << 2) | (a3 >>> 6)) & 0x3f]; octets [j + 3] = codingTable [a3 & 0x3f]; } int b1; int b2; int b3; int d1; int d2; commutateur (module) {cas 0: / * Il ne reste plus rien à faire * / casser; Cas 1: D1 = données [data.length - 1] & 0xff; b1 = (d1 >>> 2) & 0x3f; b2 = (d1 << 4) & 0x3f; bytes [bytes.length - 4] = codingTable [b1]; bytes [bytes.length - 3] = codingTable [b2]; bytes [bytes.length - 2] = (byte) '='; bytes [bytes.length - 1] = (byte) '='; casser; Cas 2: D1 = données [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] = codingTable [b1]; bytes [bytes.length - 3] = codingTable [b2]; bytes [bytes.length - 2] = codingTable [b3]; bytes [bytes.length - 1] = (byte) '='; casser; } retour des octets; } public statique byte [] decode (byte [] data) {octet [] octets; octet B1; octet B2; octet B3; octet B4; data = DiscardNonBase64Bytes (données); if (data [data.length - 2] == '=') {bytes = new byte [(((data.length / 4) - 1) * 3) + 1]; } else if (data [data.length - 1] == '=') {bytes = new byte [(((data.length / 4) - 1) * 3) + 2]; } else {bytes = new byte [((data.length / 4) * 3)]; } pour (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]]; octets [j] = (octet) ((b1 << 2) | (b2 >> 4)); octets [j + 1] = (octet) ((b2 << 4) | (b3 >> 2)); octets [j + 2] = (octet) ((b3 << 6) | b4); } if (data [data.length - 2] = '=') {b1 = decodingTable [data [data.length - 4]]; b2 = decodingTable [data [data.length - 3]]; bytes [bytes.length - 1] = (octet) ((b1 << 2) | (b2 >> 4)); } else if (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] = (octet) ((b1 << 2) | (b2 >> 4)); bytes [bytes.length - 1] = (octet) ((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] = (octet) ((b1 << 2) | (b2 >> 4)); bytes [bytes.length - 2] = (octet) ((b2 << 4) | (b3 >> 2)); bytes [bytes.length - 1] = (octet) ((b3 << 6) | b4); } retour des octets; } byte statique public [] Decode (données de chaîne) {octet [] octet b1; octet B2; octet B3; octet B4; data = DiscardNonBase64Chars (données); 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)]; } pour (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)]; octets [j] = (octet) ((b1 << 2) | (b2 >> 4)); octets [j + 1] = (octet) ((b2 << 4) | (b3 >> 2)); octets [j + 2] = (octet) ((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] = (octet) ((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] = (octet) ((b1 << 2) | (b2 >> 4)); bytes [bytes.length - 1] = (octet) ((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] = (octet) ((b1 << 2) | (b2 >> 4)); bytes [bytes.length - 2] = (octet) ((b2 << 4) | (b3 >> 2)); bytes [bytes.length - 1] = (octet) ((b3 << 6) | b4); } pour (int i = 0; i <bytes.length; i ++) System.out.println ("," + bytes [i]); RETOUR des octets; } octet statique privé [] DiscardNonBase64Bytes (byte [] data) {byte [] temp = new Byte [data.length]; int byteSpied = 0; for (int i = 0; i <data.length; i ++) {if (isValidBase64Byte (data [i])) {temp [bytescopied ++] = data [i]; }} octet [] newData = new byte [byteSpied]; System.ArrayCopy (temp, 0, newdata, 0, bytespied); retourner newdata; } private static string DiscardNonBase64Chars (String data) {StringBuffer sb = new StringBuffer (); int length = data.length (); for (int i = 0; i <length; i ++) {if (isValidBase64Byte ((byte) (data.charat (i)))) {sb.append (data.charat (i)); }} return sb.toString (); } private static boolean isValidBase64Byte (octet b) {if (b == '=') {return true; } else if ((b <0) || (b> = 128)) {return false; } else if (decodingTable [b] == -1) {return false; } return true; } Public Static String Encode (String Data, String Charset) lève une exception {// byte [] result = (data.getBytes ("Unicode")); if (data == null || data.length () == 0) return data; int offset = 0; // Une fois que GetBytes ("Unicode") est tourné, deux octets "Fe" seront ajoutés au octet avant [] résultat = encode (data.getBytes (charset), offset); StringBuffer sb = new StringBuffer (result.length); pour (int i = 0; i <result.length; i ++) sb.append (((char) result [i]); return sb.toString (); } public static String Decode (String Data, String Charset) lève une exception {if (data == null || data.length () == 0) return data; return new String (base64.decode (data), charset); } public static void main (string [] args) lève une exception {String data = "we"; String data1 = Encode (data, "Unicode"); String data2 = Decode (data1, "Unicode"); System.out.println (données); System.out.println (data1); System.out.println (data2); }} Annexe 2: Base64 Encodage en javascript
<html> <head> <title>base64 Encoding/Decoding</title> </head> <script type="text/javascript"><!-- var keyStr = "ABCDEFGHIJKLMNOP" + "QRSTUVWXYZabcdef" + "ghijklmnopqrstuv" + "wxyz0123456789+/" + "="; fonction encode64 (input) {input = UnicoDetoBytes (entrée); var output = ""; var chr1, chr2, chr3 = ""; var enc1, enc2, enc3, enc4 = ""; var i = 0; do {ch1 = input [i ++]; chr2 = input [i ++]; chr3 = input [i ++]; ENC1 = CHR1 >> 2; Enc2 = ((Chr1 et 3) << 4) | (Chr2 >> 4); Enc3 = ((chr2 et 15) << 2) | (ch3 >> 6); ENC4 = CHR3 & 63; if (isnan (chr2)) {enc3 = enc4 = 64; } else if (isnan (ch3)) {enc4 = 64; } output = output + keystr.charat (enc1) + keystr.charat (enc2) + keystr.charat (enc3) + keystr.charat (ENC4); chr1 = ch2 = ch3 = ""; ENC1 = ENC2 = ENC3 = ENC4 = ""; } while (i <input.length); sortie de retour; } fonction decode64 (input) {var output = ""; var chr1, chr2, chr3 = ""; var enc1, enc2, enc3, enc4 = ""; var i = 0; // supprime tous les caractères qui ne sont pas az, az, 0-9, +, /, ou = var base64test = / [^ a-za-z0-9 / + /// =] / g; if (base64test.exec (input)) {alert ("Il y avait des caractères de base64 non valides dans le texte d'entrée./n" + "Les caractères de base64 valides sont az, az, 0-9, '+', '/', et '=' / n" + "attendre des erreurs dans le décodage."); } input = input.replace (/ [^ a-za-z0-9 / + /// =] / g, ""); sortie = nouveau 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 et 15) << 4) | (ENC3 >> 2); Chr3 = ((Enc3 et 3) << 6) | ENC4; Output.push (Chr1); if (Enc3! = 64) {output.push (chr2); } if (enc4! = 64) {output.push (chr3); } ch1 = chr2 = ch3 = ""; ENC1 = ENC2 = ENC3 = ENC4 = ""; } while (i <input.length); return byTesTounicode (sortie); } fonction UnicoDetoBytes (s) {var result = new Array (); if (s == null || s == "") Retour Résultat; Result.push (255); // ajouter "Fe" à la tête Result.push (254); pour (var i = 0; i <s.Length; i ++) {var c = s.Charcodeat (i) .toString (16); if (c.length == 1) i = "000" + c; else 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); } Retour Résultat; } fonction byTesTounicode (bs) {var result = ""; var offset = 0; if (bs.length> = 2 && bs [0] == 255 && bs [1] == 254) offset = 2; // delete "fe" pour (var i = offset; i <bs.length; i + = 2) {var code = bs [i] + (bs [i + 1] << 8); result + = string.fromCharcode (code); } Retour Résultat; } // -> </ script> <body> <form name = "Base64form"> Tapez le message que vous souhaitez encoder dans la base64, ou collez <br> Base64 encodé de texte dans le champ de texte, sélectionnez Encoder ou décode, <br> et cliquez sur le bouton! <br> <Textarea Name = <brea> <bouls = "40" Rows = "6"> </Textare> name = "Encode" value = "Encode vers la base64" onclick = "document.base64form.thetext.value = encode64 (document.base64form.theText.value);"> <input type = "Button" name = "Decode" value = "Decode à partir de la base64" onClick = "document.base64form.theText.value = decode64 (document.base64form.theText.value);"> </ form> </body> </html>Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!