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. Например, если слово «мы» - это код GBK, оно будет ZTLDXW == после преобразования в BASE64; Если это код UTF-8, он будет 5OIR5LUS после преобразования в BASE64.
Это "Us" ==》 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 (data, "Unicode"); // кодирование кодирования Java
decode64 (data); // декодирование JavaScript
Приложение 1: кодирование базы64 в Java
пакет websharp.util; открытый класс BASE64 {Private Static Final Byte [] eNcodingTable = {(byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (byte) ', i', (byte) ', (byte)', (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)', byte) ', (byte) (Byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j', (byte) 'k', (byte) ', (byte)', (byte) '(byte)', (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)', (byte) ', (byte)', (byte) ', (byte) (байт) '3', (байт) '4', (байт) '5', (byte) '6', (байт) '7', (байт) '8', (байт) '9', (byte) '+', (byte) '/'}; частный статический финальный байт [] декодингттибель; static {decodingtable = новый байт [128]; for (int i = 0; i <128; i ++) {decodingtable [i] = (byte) -1; } for (int i = 'a'; i <= 'z'; i ++) {decodingtable [i] = (byte) (i - 'a'); } for (int i = 'a'; i <= 'z'; i ++) {decodingtable [i] = (byte) (i - 'a'+26); } for (int i = '0'; i <= '9'; i ++) {decodingtable [i] = (byte) (i - '0'+52); } decodingtable ['+'] = 62; декодингттибель ['/'] = 63; } public Static Byte [] Encode (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; for (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]; байты [j + 1] = encodingtable [((a1 << 4) | (A2 >>> 4)) & 0x3f]; байты [j + 2] = encodingtable [((a2 << 2) | (a3 >>> 6)) & 0x3f]; байты [j + 3] = encodingtable [a3 & 0x3f]; } int b1; int b2; int b3; int d1; int d2; Switch (modulus) {case 0: / * ничего не осталось сделать * / break; случай 1: d1 = data [data.length - 1] & 0xff; b1 = (d1 >>> 2) & 0x3f; b2 = (d1 << 4) & 0x3f; байты [bytes.length - 4] = incodingtable [b1]; байты [bytes.length - 3] = incodingtable [b2]; байты [bytes.length - 2] = (byte) '='; байты [bytes.length - 1] = (byte) '='; перерыв; Случай 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.length - 4] = incodingtable [b1]; байты [bytes.length - 3] = incodingtable [b2]; байты [bytes.length - 2] = incodingtable [b3]; байты [bytes.length - 1] = (byte) '='; перерыв; } вернуть байты; } public static byte [] decode (byte [] data) {byte [] bytes; байт B1; байт B2; байт B3; байт B4; data = discardnonbase64bytes (data); 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)]; } for (int i = 0, j = 0; i <(data.length - 4); i += 4, j += 3) {b1 = декодингтабель [data [i]]; b2 = декодингтабель [data [i + 1]]; b3 = декодингтабель [data [i + 2]]; b4 = декодингтабель [data [i + 3]]; байты [j] = (байт) ((b1 << 2) | (b2 >> 4)); байты [j + 1] = (byte) ((b2 << 4) | (b3 >> 2)); байты [j + 2] = (byte) ((b3 << 6) | b4); } if (data [data.length - 2] = '=') {b1 = decodingtable [data [data.length - 4]]; b2 = декодингтабель [data [data.length - 3]]; байты [bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4)); } else if (data [data.length - 1] == '=') {b1 = decodingtable [data [data.length - 4]]; b2 = декодингтабель [data [data.length - 3]]; b3 = декодингтабель [data [data.length - 2]]; байты [bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4)); байты [bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2)); } else {b1 = decodingtable [data [data.length - 4]]; b2 = декодингтабель [data [data.length - 3]]; b3 = декодингтабель [data [data.length - 2]]; b4 = декодингтабель [data [data.length - 1]]; байты [bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4)); байты [bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2)); байты [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]; } else if (data.charat (data.length () - 1) == '=') {bytes = new Byte [(((data.length () / 4) - 1) * 3) + 2]; } else {bytes = new Byte [((data.length ()) / 4) * 3)]; } for (int i = 0, j = 0; i <(data.length () - 4); i += 4, j += 3) {b1 = декодингтабель [data.charat (i)]; b2 = декодингтабель [data.charat (i + 1)]; b3 = декодингтабель [data.charat (i + 2)]; b4 = декодингтабель [data.charat (i + 3)]; байты [j] = (байт) ((b1 << 2) | (b2 >> 4)); байты [j + 1] = (byte) ((b2 << 4) | (b3 >> 2)); байты [j + 2] = (byte) ((b3 << 6) | b4); } if (data.charat (data.length () - 2) == '=') {b1 = декодингтабель [data.charat (data.length () - 4)]; b2 = декодингтабель [data.charat (data.length () - 3)]; байты [bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4)); } else if (data.charat (data.length () - 1) == '=') {b1 = decodingtable [data.charat (data.length () - 4)]; b2 = декодингтабель [data.charat (data.length () - 3)]; b3 = декодингтабель [data.charat (data.length () - 2)]; байты [bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4)); байты [bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2)); } else {b1 = decodingtable [data.charat (data.length () - 4)]; b2 = декодингтабель [data.charat (data.length () - 3)]; b3 = декодингтабель [data.charat (data.length () - 2)]; b4 = декодингтабель [data.charat (data.length () - 1)]; байты [bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4)); байты [bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2)); байты [bytes.length - 1] = (byte) ((b3 << 6) | b4); } for (int i = 0; i <bytes.length; i ++) System.out.println (","+Bytes [i]); вернуть байты; } частный статический байт [] discardnonbase64bytes (byte [] data) {byte [] temp = new Byte [data.length]; int bytescopied = 0; for (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); вернуть Ньюдату; } частная статическая строка 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 (); } частная статическая логическая isvalidbase64byte (byte b) {if (b == '=') {return true; } else if ((b <0) || (b> = 128)) {return false; } else if (decodingtable [b] == -1) {return false; } вернуть true; } public Static String Encode (String Data, String charset) бросает исключение {// byte [] result = (data.getbytes ("Unicode")); if (data == null || data.length () == 0) вернуть данные; int offset = 0; // после того, как GetSbytes («Unicode») повернут, два байта «Fe» будут добавлены в передний байт [] result = encode (data.getbytes (charset), offset); StringBuffer SB = new StringBuffer (result.length); для (int i = 0; i <result.length; i ++) sb.append ((char) result [i]); вернуть sb.toString (); } public Static String DeCode (String Data, String charset) бросает исключение {if (data == null || data.length () == 0) возвращает данные; вернуть новую строку (base64.decode (data), charset); } public static void main (string [] args) бросает исключение {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); }} Приложение 2: Кодирование BASE64 в JavaScript
<html> <head> <Title> Base64 Кодирование/декодирование </title> </head> <script type = "text/javascript"> <!- var keystr = "abcdefghijklmnop" + "qrstuvwxyzabcdef" + "ghijklmnopqrStuv" + "wxyz01231 +/" ghijklmnopqrStuv " +" wxyz01236/" +" ghij "="; 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 ++]; ec1 = 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 (ec3) + keystr.charat (enc4); chr1 = chr2 = chr3 = ""; Enc1 = Enc2 = Enc3 = Enc4 = ""; } while (i <input.length); вернуть выход; } функция decode64 (input) {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 («Был неверные символы Base64 в вводе. } 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 ++)); ec4 = 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); вернуть Bytestounicode (output); } функция Unicodetobytes (s) {var result = new Array (); if (s == null || s == ") return result; result.push (255); // добавить «fe» в Head Result.push (254); for (var i = 0; i <s.length; i ++) {var c = s.charcodeat (i) .toString (16); if (c.length == 1) i = "000"+c; иначе if (c.length == 2) c = "00"+c; иначе 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); } return Result; } функция bytestounicode (bs) {var result = ""; var offset = 0; if (bs.length> = 2 && bs [0] == 255 && bs [1] == 254) offset = 2; // Удалить "fe" для (var i = offset; i <bs.length; i+= 2) {var code = bs [i]+(bs [i+1] << 8); result+= string.fromCharcode (код); } return Result; } //-> </script> <body> <form name = "base64form"> введите в сообщение, которое вы хотите кодировать в base64, или вставить <br> кодированный текст Base64 в текстовое поле, выберите Encode или Decode, <br> и нажмите кнопку! name = "encode" value = "encode to base64" onclick = "document.base64form.thetext.value = encode64 (document.base64form.thetext.value);"> <input type = "кнопка" name = "decode" value = "Decode From Base64" onclick = "document.base64form.thetext.value = decode64 (document.base64form.thetext.value);"> </form> </body> </html>Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!