1
Creați și denumiți fișierul.
2
Deschideți editorul, cum ar fi Notepad sau vi, și introduceți codul preliminar, cum ar fi declarația de clasă și constantele cunoscute. Apelați fișierul Base64.java.
3
Aceste valori constante sunt specificate, așa cum este indicat în articol, în RFC-urile relevante. Este de obicei o idee bună să citiți toate RFC-urile relevante înainte de a începe codarea.
public class Base64 {privat statică finală String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789" + "+ /" - privat statică finală int = splitLinesAt 76-
4
Tratarea caracterelor ca octeți înseamnă că caracterele cu octeți multiple, cum ar fi japonezii sau chinezii, nu vor fi codificați cu greu. Prin urmare, trebuie să folosim metoda String getBytes () pentru a putea converti caracterele Unicode din locația curentă în octeți înainte de începerea codării. Dar, de exemplu, dacă lucrați la un document japonez într-o locație englezo-americană, va trebui să specificați locația rezultatului getBytes (), cum ar fi getBytes ("UTF-8").
5
Să aflăm câți octeți sunt necesari. Operatorul de module Java,%, este util aici. De asemenea, vom declara numele și parametrii subrutinei, deoarece suntem aici.
6
Acum folosim acea valoare pentru a umple intrarea nulă. Rețineți că, dacă nu este necesară nicio umplere, nu se va adăuga nicio plăcuță, deoarece am luat modulul 3 oa doua oară, transformând un 3 într-un 0.
byte public static [] zeroPad (lungime int, byte [] bytes) {byte [] = new byte capitonat [lungime] - // inițializat la zero de către JVM System.arraycopy (bytes, 0, matlasate, 0, bytes.length) - returnează encode padded-} public static string (string string) string codificat = { "" - byte [] = stringArray- try {stringArray String.getBytes ( "UTF-8") - // folosesc șirul de cod corespunzător! } Catch (Excepție ignorată) = {stringArray String.getBytes () - // utiliza locația implicită în schimb paddingCount} = int (3 - (3 stringArray.length%))% 3 = stringArray zeroPad (+ stringArray.length paddingCount, stringArray) -
7
Acum că am ajuns la umplere: comprimați trei octeți în același timp într-un număr întreg de 24 biți, apoi extrageți indicele pe 6 biți în șirul de codificare. Aceste numere nu sunt magice: 24 este împărțit de 6 exact de 4 ori, iar 6 biți pot stoca valori de la 0 la 63, care pot fi indexate la orice valoare într-un șir codificat în baza 64.
pentru (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) -}
8
În cele din urmă, vom pachet rezultatul după completarea lui prin introducerea noilor linii în limitele necesare de 76 octeți, folosind o subrutină separată pentru ao face mai clară.splitLines reveni (encoded.substring (0, encoded.length () - paddingCount) + "==" substring (0, paddingCount).) - splitLines} public String static (String String) Linii String = { "" -pentru (int i = 0- i < string.length()- i += splitLinesAt) {lines += string.substring(i, Math.min(string.length(), i +splitLinesAt))-lines += "rn"-}return lines-}
9
Putem, dacă vrem, să adăugăm o rutină principală de testare. Aceasta este de obicei o idee bună înainte de a posta codul pentru consumul public.
public static void principal (String [] args) {pentru (int i = 0- i < args.length- i++) {System.err.println("codificando "" + args[i] + """)-System.out.println(encode(args[i]))-}}
10
Iată modul completat:public class Base64 {privat static finală String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+ /" - int finală private static splitLinesAt = 76 public-byte static [] zeroPad (lungime int, byte [] bytes) {byte [] = new byte capitonat [lungime] - // inițializat la zero prin JVMSystem.arraycopy (bytes, 0, capitonată, 0, bytes.length) -return codificării padded-} string (string string) public static string {encoded = "" -byte [] stringArray-try {stringArray String.getBytes = ( "UTF-8") - // folosesc șirul de criptare corespunzătoare} catch (Exception ignorat) = {stringArray String.getBytes () - // utilizați locația implicită în schimb} // determina cât de multe bytes de umplutură va adăuga la resultadoint paddingCount = (3 - (stringArray.length% 3))% 3 - // adauga umplutura necesar entradastringArray = zeroPad (stringArray.length + paddingCount, stringArray) - proces // 3 octeți la un moment dat, crearea // 4-byte rezultat griji despre noile insertii rând afterfor (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) -} // inlocuieste cu nul de umplere "=" return splitLines (encoded.substring (0, encoded.length () -paddingCount) + "==" subșir (0, paddingCount)) -.} Public static String splitLines (string string) linii string = { "" -pentru (int i = i 0- < string.length()- i += splitLinesAt) {lines += string.substring(i, Math.min(string.length(), i + splitLinesAt))-lines += "rn"-}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]))-}}}
11
Să compilați, folosind javac, gcj, jikes sau un alt compilator și test similar, folosind citatul lui Hobbes din articolul Wikipedia:$ $ Java GCJ -C Base64.java Base64 „Omul se distinge, nu numai din cauza lui, ci prin thissingular pasiune de la alte animale, care este o pofta a minții, că prin aperseverance încântării în generarea continuă și ofknowledge neobosită, depășește vehemența scurtă a oricărei plăceri. "
12
Iată rezultatul:codificare „Omul se distinge, nu numai din cauza lui, dar de această singularpassion de la alte animale, care este o pofta a minții, că prin aperseverance încântării în ofknowledge continuă și neobosită generație, depășește vehemența scurt de orice plăcere trupească. „TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4 =
13
Un meci perfect! Acest lucru înseamnă fie că ambele programe sunt greșite, fie că sunt mai mult sau mai puțin corecte. În acest moment, poate doriți să revizuiți articolul Wikipedia și să citiți RFC-urile pentru a vedea dacă uităm ceva.