Як закодувати рядок в Base64 за допомогою Java
Base64 - це метод шифрування кожних 3-х байтів введення в 4 байта виводу. Він широко використовується для кодування фото і аудіо при відправці електронною поштою (хоча часи 7-бітної передачі даних пройшли) і захисту ідентифікаційних даних (зразок логіна і пароля) на веб-сайтах від перехоплення. Тут представлений приклад, як написати шифрувальник Base64 на популярному мультиплатформенні мові Java. Цей приклад і пробна рядок коду були взяти зі статті у Вікіпедії.
Кроки
1
Введіть інформацію та ім`я файлу2
Відкрийте ваш текстовий редактор, наприклад, Блокнот або vi, і зробіть підготовчу роботу, задавши класи і відомі константи. Назвіть файл Base64.java.3
Згідно статті, значення констант відповідають останнім робочим пропозиціями (RFC). У будь-якому випадку, варто перечитати найбільш свіжі робочі пропозиції, перш ніж починати писати код.
{{{1}}}
- Тепер розглянемо найголовніше - одночасне стиск 3-х байтів в 24-бітове ціле число і витяг з нього 6-бітних індексів в кодує рядок. Це не якісь чарівні числа: 24 при діленні на 6 дає 4, 6 бітів можуть містити числа від 0 до 63, які можуть вказувати на будь-яке значення в 64-бітної кодує рядку.
for (int i = 0; i <</span> stringArray.length; i += 3) {int j = ((stringArray[i] 0xff) << 16) +((stringArray[i + 1] 0xff) << 8) +(stringArray[i + 2] 0xff);encoded = encoded + base64code.charAt((j 18) 0x3f) +base64code.charAt((j 12) 0x3f) +base64code.charAt((j 6) 0x3f) +base64code.charAt(j 0x3f);}
for (int i = 0; i <</span> stringArray.length; i += 3) {int j = ((stringArray[i] 0xff) << 16) +((stringArray[i + 1] 0xff) << 8) +(stringArray[i + 2] 0xff);encoded = encoded + base64code.charAt((j 18) 0x3f) +base64code.charAt((j 12) 0x3f) +base64code.charAt((j 6) 0x3f) +base64code.charAt(j 0x3f);}
}}
- Нарешті, після додавання вільних осередків, стискаємо вихід, вставляючи переклад рядка в необхідні 76-бітові кордону, використовуючи окрему підпрограму для ясності.
{CodeBoxpublic static String splitLines(String string) {String lines = "";for (int i = 0; i <</span> string.length(); i += splitLinesAt) {lines += string.substring(i, Math.min(string.length(), i +splitLinesAt));lines += " R N";}return lines;}
"==". Substring (0, paddingCount)) -} public static String splitLines (String string) {String lines = "" - for (int i = 0- i < string.length()- i += splitLinesAt) { lines += string.substring(i, Math.min(string.length(), i + splitLinesAt))- lines +="rn"- } return lines- } }}
- При бажанні, можна додати основну програму з метою проведення випробувань. Це також слід робити перед викладанням програми для загального користування.
{{CodeBox|<</span>source lang="Java"public static void main(String[] args) {for (int i = 0; i <</span> args.length; i++) {System.err.println("Encoding "" + args[i] + """);System.out.println(encode(args[i]));}}
for (int i = 0- i < args.length- i++) { System.err.println("encoding"" + args[i] +""")- System.out.println(encode(args[i]))- } } }}
- Тут представлений закінчений модуль:
{{CodeBox|<</span>source lang="Java"public class Base64 {private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"+ "Abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+ /";private static final int splitLinesAt = 76;public static byte[] zeroPad(int length, byte[] bytes) {byte[] padded = new byte[length]; // Визначається віртуальною машиною як 0 System.arraycopy(bytes, 0, padded, 0, bytes.length);return padded;}public static String encode(String string) {String encoded = "";byte[] stringArray;try {stringArray = string.getBytes("cp1251");// Використовуйте відповідну кодує рядок! } catch (Exception ignored) {stringArray = string.getBytes();// Використовуйте регіон за замовчуванням }// Визначте, скільки вільних байтів потрібно додати на виході int paddingCount = (3 ; (stringArray.length % 3)) % 3;// Додайте вільні байти на вході при необхідності stringArray = zeroPad(stringArray.length + paddingCount, stringArray);// Обробляйте 3 байти одночасно, одержуючи на виході 4 // Турбуйтеся про перенесення рядка пізніше for (int i = 0; i <</span> stringArray.length; i += 3) {int j = ((stringArray[i] 0xff) << 16) +((stringArray[i + 1] 0xff) << 8) +(stringArray[i + 2] 0xff);encoded = encoded + base64code.charAt((j 18) 0x3f) +base64code.charAt((j 12) 0x3f) +base64code.charAt((j 6) 0x3f) +base64code.charAt(j 0x3f);}// Замініть закодовані порожні значення вільних байтів за допомогою "=" return splitLines(encoded.substring(0, encoded.length() ;paddingCount) + "==".substring(0, paddingCount));}public static String splitLines(String string) {String lines = "";for (int i = 0; i <</span> string.length(); i += splitLinesAt) {lines += string.substring(i, Math.min(string.length(), i + splitLinesAt));lines += " R N";}return lines;}public static void main(String[] args) {for (int i = 0; i <</span> args.length; i++) {System.err.println("Encoding "" + args[i] + """);System.out.println(encode(args[i]));}}}
private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+ /";
private static final int splitLinesAt = 76;
public static byte [] zeroPad (int length, byte [] bytes) {byte [] padded = new byte [length] - // initialized to zero by JVM System.arraycopy (bytes, 0, padded, 0, bytes.length) - return padded-}
public static String encode (String string) {
String encoded = "" - byte [] stringArray- try {stringArray = string.getBytes ("cp1251") - // use appropriate encoding string! } Catch (Exception ignored) {stringArray = string.getBytes () - // use locale default rather than croak} // determine how many padding bytes to add to the output int paddingCount = (3 - (stringArray.length% 3)) % 3- // add any necessary padding to the input stringArray = zeroPad (stringArray.length + paddingCount, stringArray) - // process 3 bytes at a time, churning out 4 output bytes // worry about CRLF insertions later for (int i = 0- i < stringArray.length- i += 3) { int j = ((stringArray[i] & 0xff) << 16) + ((stringArray[i + 1] & 0xff) << 8) + (stringArray[i + 2] & 0xff)- encoded = encoded + base64code.charAt((j>> 18) 0x3f) + base64code.charAt ((j>> 12) 0x3f) + base64code.charAt ((j>> 6) 0x3f) + base64code.charAt (j 0x3f) -} // replace encoded padding nulls with "=" return splitLines (encoded.substring (0, encoded.length () - paddingCount) + "==". Substring (0, paddingCount));
} Public static String splitLines (String string) {
String lines = "" - for (int i = 0- i < string.length()- i += splitLinesAt) {
lines + = string.substring (i, Math.min (string.length (), i + splitLinesAt)) - lines + = " r n";
} Return lines;
} Public static void main (String [] args) {
for (int i = 0- i < args.length- i++) {
System.err.println ("encoding" "+ args [i] +" "") - System.out.println (encode (args [i]));
}
}
} }}
- Тепер компілюємо це, використовуючи javac, gcj, jikes або що-небудь схоже. Відчуваємо, використовуючи цитату Гоббса зі статті у Вікіпедії:
{CodeBox} Ось результат:{<</span>source lang="Java"encoding "Man is distinguished, not only by his reason, but by this singularpassion from other animals, which is a lust of the mind, that by aperseverance of delight in the continued and indefatigable generation ofknowledge, exceeds the short vehemence of any carnal pleasure."TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure. "
TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4 = }
- Сходиться! Це може означати, що або обидві програми неправильні, або що обидві більш менш правильні. У такому випадку, слід заново відвідати ту статтю у Вікіпедії і прочитати робочі пропозиції на випадок, якщо тут щось упущено.
Поради
- Не бійтеся почати писати код, якщо чогось не розумієте. Все стає зрозуміліше на практиці.
- Java добре підходить для загальних цілей і для написання додатків для пристроїв на зразок смартфонів, але javascript і Python володіють потужнішим і лаконічним синтаксисом. У різних мов різні сильні і слабкі сторони.
- Спробуйте написати додатковий метод decode () для цього модуля.
- Хоча вивчати робочі пропозиції (RFC) необхідно для промислового програмування, кількість інформації може збити з пантелику новачка. Тому іноді можна швидко переглянути ці дані, почати писати код, грунтуючись на наявних даних, а потім перевірити функціональність, порівнюючи з вимогами робочого пропозиції.