gtemata.com

Cum de a codifica un string la Base64 în Java

Base64 este o metodă de a codifica fiecare 3 bytes de intrare în 4 octeți de bază de obiective este frecvent utilizat pentru a codifica imaginea sau audio pentru a le trimite la adresa de e-mail (deși era liniile unei transmisii cu 7-byte este practic terminat), și o modalitate de a ascunde autentificarea paginilor web (nume de utilizator și parolă) de la spionaj. Iată un exemplu de programare a unui codificator Base64 în Java, un limbaj de programare multi-platformă. Acest exemplu și corzile de codificare a testului sunt împrumutate de laArticol Wikipedia

conținut

.

paşi

1
Introduceți informațiile și numele fișierului.
  • 2
    Porniți editorul, de exemplu Notepad, și introduceți informații preliminare, cum ar fi declarația de clasă și constantele cunoscute. Apelați fișierul Base64.java.
  • 3
    Valorile constante sunt specificate, așa spune articolul, în RFC-urile relevante. Este, în general, o idee bună să citiți toate RFC-urile relevante înainte de a începe să programați.
    clasa publică Base64 {private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789" + "+ /"-private static final int splitLinesAt = 76-
  • 4
    Tratarea caracterelor ca octeți înseamnă că caracterele multiple, cum ar fi japonezii sau chinezii, nu vor fi corect codate. Prin urmare, ar trebui să folosim metoda getBytes () a șirurilor de caractere pentru a converti caracterele Unicode din locația curentă în octeți înainte de începerea codificării. Dar, de exemplu, dacă lucrați la un document japonez cu localizare engleză engleză, va trebui să specificați locația pentru ieșirea getBytes (), cum ar fi getBytes ("UTF-8").
  • 5
    Să vedem câți octeți sunt necesari. Operatorul de module Java este util în acest moment. De asemenea, declarăm un nume și parametri de subrutină în timp ce suntem aici.
  • 6
    Acum folosim această valoare pentru a face un tampon nul al intrării. Rețineți că dacă nu este necesară nicio completare, nu se adaugă nimic, deoarece vom rula modulul 3 a doua oară, transformând 3 într-o valoare 0.
    byte public static [] zeroPad (lungime int, byte [] bytes) {byte [] capitonată = new byte [lungime] - // inițializat la zero prin JVMSystem.arraycopy (bytes, 0, capitonată, 0, bytes.length) - return padded-} public static Codificare șir (șir de caractere) {String encoded = ""-byte [] șirArray-încercați {stringArray = string.getBytes ("UTF-8") - // utilizați șir corespunzător de codare} captură! (Excepție ignorată) {stringArray string.getBytes = () - // default uz local, mai degrabă decât paddingCount croncănitură} int = (3 - (stringArray.length% 3))% 3- stringArray = zeroPad (stringArray.length + paddingCount, stringArray) -
  • 7
    Acum hai să ajungem la subiect: am împachetat 3 octeți într-un număr întreg de 24 de biți, apoi extragem un index pe 6 biți în șirul de codificare. Aceste numere nu sunt magice: 24 este împărțit în 4 până la 6 și 6 biți pot conține valori de la 0 la 63, care poate fi indexat la orice valoare într-un șir de codificare pe 64 de biți.
    pentru (int i = 0- i < stringArray.length- i + = 3) {int j = ((stringArray [i] & 0xFF) << 16) + ((șirArray [i + 1] & 0xFF) << 8) + (stringArray [i + 2] & 0xff) -codificat = codificat + base64code.charAt ((j > 18) & 0x3f) + base64code.charAt ((j > 12) & 0x3f) + base64code.charAt ((j > 6) & 0x3f) + base64code.charAt (j & 0x3F) -}


  • 8
    În cele din urmă, am pachet de ieșire, după ce capitonarea, CRLF prin introducerea capetelor 76 de octeți necesari, folosind o subrutină special pentru claritate.
    retur splitLines (coded.substring (0, encoded.length () - paddingCount) +"==".substring (0, paddingCount)) -} statice publice String splitLines (șir de șir) {String lines = ""-for (int i = 0- i < string.length () - i + = splitLinesAt) {linii + = string.substring (i, Math.min (string.length (), i + splitLinesAt) " R n"-} linii de întoarcere-}
  • 9
    Dacă dorim, putem adăuga o rutină principală pentru testare. Aceasta este, de obicei, o idee bună înainte de a face codul dvs. la dispoziția publicului.
    public static void principal (String [] args) {pentru (int i = 0- i < args.length- i ++) {System.err.println ("codarea "" + args [i] + """) -System.out.println (codifice (args [i])) -}}
  • 10
    Iată formularul complet:

    clasa publică Base64 {private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789" + "+ /"static int finală privată = 76 byte-splitLinesAt public static [] zeroPad (lungime int, byte [] bytes) {byte [] capitonată = new byte [lungime] - // inițializat la zero prin JVMSystem.arraycopy (octeți, 0, padded, 0, bytes.length) - retur plinat-} static public String encode (String string) {String encoded = ""-byte [] șirArray-încercați {stringArray = string.getBytes ("UTF-8") - // utilizați șir de codificare corespunzătoare} Catch (Excepție ignorată) {stringArray string.getBytes = () - // folosiți implicit local și nu croncănitură} // determina cât de multe bytes umplutură pentru a adăuga la paddingCount outputint = (3 - (stringArray.length% 3))% 3 - necesar // adăuga orice umplutură la inputstringArray = zeroPad (stringArray.length + paddingCount, stringArray) - // proces 3 octeți la un moment dat, churning patru octeți de ieșire // griji Inserțiile CRLF laterfor (int i = 0- i < stringArray.length- i + = 3) {int j = ((stringArray [i] & 0xFF) << 16) + ((șirArray [i + 1] & 0xFF) << 8) + (stringArray [i + 2] & 0xff) -codificat = codificat + base64code.charAt ((j > 18) & 0x3f) + base64code.charAt ((j > 12) & 0x3f) + base64code.charAt ((j > 6) & 0x3f) + base64code.charAt (j & 0x3f) -} // înlocuiți nodurile codificate de umplere cu "="retur splitLines (coded.substring (0, encoded.length () -paddingCount) + "==".substring (0, paddingCount)) -} statice publice String splitLines (șir de șir) {String lines = ""-for (int i = 0- i < string.length () - i + = splitLinesAt) {linii + = string.substring (i, Math.min (string.length (), i + splitLinesAt) " R n"-} liniile returului-} static public void principal (String [] args) {pentru (int i = 0- i < args.length- i ++) {System.err.println ("codarea "" + args [i] + """) -System.out.println (codifice (args [i])) -}}}
  • 11
    Compilați-l, folosind javac, gcj, jikes sau orice doriți și încercați-l, folosind citatul Hobbes din articolul Wikipedia:
    $ gcj -C Base64.java $ java Base64 "Nu este singurul motiv pentru asta, dar nu numai prin rațiunea lui, ci și prin alte animale, care este o poftă a minții."
  • 12
    Iată rezultatul:

    codare "Omul se distinge, nu numai din cauza Lui, ci prin această singularpassion de la alte animale, care este o pofta de minte, că prin aperseverance încântării în ofknowledge a continuat și neobosită generație, Depășește vehemența scurt de orice plăcere carnale."TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4 =
  • 13
    Corespunde exact! Aceasta înseamnă fie că ambele programe sunt greșite, fie că sunt mai mult sau mai puțin corecte. În acest moment, veți dori să revizuiți articolul Wikipedia și să citiți RFC-urile conectate pentru a verifica dacă nu ați uitat nimic.
  • Sfaturi

    • Nu credeți că întotdeauna trebuie să înțelegeți complet ceva înainte de al codifica. Fiți mai clară când mergeți.
    • Java este bine ca un limbaj general de programare, iar pentru dispozitive precum telefoanele mobile poate fi singura alternativă pentru programatori - dar s-ar putea găsi sintaxa lui jаvascript sau Python mai concisă și mai puternică. Fiecare limbă are propriile sale puncte forte și puncte slabe.
    • Încercați să scrieți metoda de decodificare () pentru acest modul!
    • În timp ce citiți RFC relevant este necesară pentru a produce codul, excesul de informații pot fi opprimente-, uneori, cea mai bună metodă este scremarli, cod scrie bazat pe ceea ce ați înțeles, și apoi du-te înapoi și să verificați baza funcționalității punct cu punct cu privire la cerințele de bază stabilite în RFC.
    Distribuiți pe rețelele sociale:

    înrudit