Відповіді на всі випадки життя прямо на цьому сайті

Як закодувати рядок в Base64 з допомогою Java

Кроки

  • Encode a String to Base64 With Java Step 1.jpg 1 Введіть інформацію та ім'я файлу
  • Encode a String to Base64 With Java Step 2.jpg 2 Відкрийте ваш текстовий редактор, наприклад Блокнот або vi, і зробіть підготовчу роботу, задавши класи і відомі константи. Назвіть файл Base64.java.
  • 3 Згідно статті, значення констант відповідають останнім робочим пропозицій (RFC). У будь-якому випадку, варто перечитати найбільш свіжі робочі пропозиції, перш ніж починати писати код.
  • 1}}

    • Тепер розглянемо найголовніше - одночасне стискання 3-х байтів в 24-бітове ціле число і витяг з нього 6-бітних індексів кодує рядок. Це не якісь чарівні числа: 24 при діленні на 6 дає 4, 6 бітів можуть містити числа від 0 до 63, які можуть вказувати на будь-яке значення в 64-бітної кодує рядку.
    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);

    Encode a String to Base64 With Java Step 3.jpg 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);

    }}



    Encode a String to Base64 With Java Step 3.jpg
  • Нарешті, після додавання вільних комірок, стискаємо вихід, вставляючи переклад рядка в необхідні 76-бітні кордону, використовуючи окрему підпрограму для ясності.
  • 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; }

    "==".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; } }}

  • При бажанні, можна додати основну програму з метою проведення випробувань. Це також слід робити перед публікацією програми для загального користування.
  • CodeBox }

    for (int i = 0; i < args.length; i ) System.err.println("encoding \"" args[i] "\""); System.out.println(encode(args[i])); } }}

  • Тут представлений закінчений модуль:
  • 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("UTF-8"); // використовувати відповідну кодує рядок! 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 < 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 < 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])); } }

    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("UTF-8"); // 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) <> 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 або що-небудь схоже. Відчуваємо, використовуючи цитату Гоббс зі статті у Вікіпедії:
  • $ gcj -C Base64.java $ java Base64 "Man is distinguished, not only by his reason, but by this singular 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 запалом of any carnal pleasure."

    $ java Base64 "Man is distinguished, not only by his reason, but by this singular 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 запалом of any carnal pleasure." Результат:

    encoding "Man is distinguished, not only by his reason, but by this singular 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 запалом of any carnal pleasure." TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdcbvbmx5igj5ighpcybyzwfzb24sigj1dcbiesb0aglz IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdghlcibhbmltywxzlcb3agljacbpcybhigx1c3qgb2yg dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzzxzlcmfuy2ugb2ygzgvsawdodcbpbib0agugy29udglu dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmvyyxrpb24gb2yga25vd2xlzgdllcblegnlzwrzihro ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55ignhcm5hbcbwbgvhc3vyzs4=

    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 запалом of any carnal pleasure."


    TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdcbvbmx5igj5ighpcybyzwfzb24sigj1dcbiesb0aglz IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdghlcibhbmltywxzlcb3agljacbpcybhigx1c3qgb2yg dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzzxzlcmfuy2ugb2ygzgvsawdodcbpbib0agugy29udglu dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmvyyxrpb24gb2yga25vd2xlzgdllcblegnlzwrzihro ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55ignhcm5hbcbwbgvhc3vyzs4=

  • Сходиться! Це може означати, що або обидві програми неправильні, або що обидві більш менш правильні. В такому разі, слід заново відвідати ту статтю в Вікіпедії і прочитати робочі пропозиції на випадок, якщо тут щось упущено.

  • Поради

    • Не бійтеся почати писати код, якщо чогось не розумієте. Все стає зрозумілішим на практиці.
    • Java добре підходить для загальних цілей і для написання додатків для пристроїв на зразок смартфонів, але javascript і Python володіють потужним і лаконічним синтаксисом. У різних мов різні сильні і слабкі сторони.
    • Спробуйте написати додатковий метод decode() для цього модуля.
    • Хоча вивчати робочі пропозиції (RFC) необхідно для промислового програмування, кількість інформації може збити з пантелику новачка. Тому іноді можна швидко переглянути ці дані, почати писати код, ґрунтуючись на наявних даних, а потім перевірити функціональність, порівнюючи з вимогами робочого пропозиції.




    Додати коментар
    Ваше ім'я:  
    Напівжирний Нахилений текст Підкреслений текст Перекреслений текст | Вирівнювання по лівому краю По центру Вирівнювання по правому краю | Вставка смайликів Вибір кольору | Прихований текст Вставка цитати Перетворити вибраний текст з транслітерації в кирилицю Вставка спойлера

    2+2*2=?