emkiset.ru

Hoe te coderen in Base64 met Java

Base64 is een methode om te coderen, elke 3 bytes aan invoer in 4 bytes aan uitvoer - het wordt heel vaak gebruikt om afbeeldingen of audiobestanden te coderen om per e-mail te verzenden (hoewel de dagen van verzending van 7-bit-bestanden bijna ten einde zijn) en een manier om te verbergen terwijl u inlogt op een website (gebruikers en wachtwoorden) van "snooping". Hier is een voorbeeld van het programmeren van een Base64-encoder in Java, een programmeertaal voor meerdere platforms.

stappen

Titel afbeelding Encode a String to Base64 Met Java Stap 1
1
Voer informatie en bestandsnaam in
  • Titel afbeelding Encode a String to Base64 Met Java Step 2
    2
    Start je favoriete editor, zoals "blocnote" of "vi"en voer de standaardcode in, net als de declaratie van klassen en constanten. Noem het bestand als Base64.java.
  • 3
    Deze constante waarden zijn specifiek, zoals vastgelegd in het artikel, in de relevante RFC (Oproep voor externe functies voor het acroniem in het Engels). Het is over het algemeen een goede gewoonte. Lees alle RFC`s voordat u een code start.
    openbare klasse Base64 {private static end String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"+ "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+ /"-private statische uiteindelijke int splitLinesAt = 76-
  • 4
    Tekens behandelen als bytes betekent dat de tekens "multibyte", zoals de Japanse of Chinese, zullen ze niet correct worden gecodeerd. Daarom moeten we de getBytes () van String-methode gebruiken om de Unicode-tekens naar bytes te converteren voordat we beginnen met coderen. Maar als u bijvoorbeeld met een Japans document werkt en het is geconfigureerd in Amerikaans-Engelse taal, moet u locale opgeven voor de uitvoer van getBytes (), evenals getBytes ("UTF-8").
  • 5


    We zullen onderzoeken hoeveel opvulbytes nodig zijn. De Java-module-operator,%, helpt veel in deze situatie. We gaan ook de naam en parameters van de subroutine aangeven terwijl we ons hierin bevinden.
  • 6
    Nu gebruiken we die waarde om de entry null pad te maken. Merk op dat als opvulling niet nodig is, dit niet hoeft te worden toegevoegd, omdat we de module 3 voor de tweede keer nemen, waarbij een 3 in een 0 wordt omgezet.
    public static byte [] ZeroPad (int lengte byte [] bytes) {byte [] = new byte gevoerde [length] - // beginwaarde nul JVMSystem.arraycopy (bytes, 0, opgevuld, 0, bytes.length) - return padded-} public static String encode (String string) {String encoded = ""-byte [] stringArray-try {stringArray = string.getBytes ("UTF-8") - // gebruiken geschikte coderende snaar} catch (Exception genegeerd) {stringArray = String.getBytes () - // gebruik standaard locale in plaats van kwaken} int paddingCount = (3 - (stringArray.length% 3)!)% 3- stringArray = zeroPad (stringArray.length + paddingCount, stringArray) -
  • Titel afbeelding Encode a String to Base64 Met Java Step 3
    7
    Als we ons nu bezighouden met wat ons bezighoudt: pak 3 bytes per keer in een 24-bits geheel getal en extraheer 6-bits indexen in de tekenreekscode. Deze getallen zijn geen magie: 24 wordt exact 4 keer gedeeld door 6 en 6 bits kunnen waarden bevatten van 0 tot 63, die elke waarde in de 64-byte-keten kunnen indexeren.



    voor (int i = 0- i < stringArray.length- i + = 3) {int j = ((stringArray [i] & 0xff) << 16) + ((stringArray [i + 1] & 0xff) << 8) + (stringArray [i + 2] & 0xff) -gecodeerd = gecodeerd + base64code.charAt ((j >> 18) & 0x3f) + base64code.charAt ((j >> 12) & 0x3f) + base64code.charAt ((j >> 6) & 0x3f) + base64code.charAt (j & 0x3f) -}
  • 8
    Ten slotte verpakken we de uitvoer, na het doen, de CRLF`s in te voegen in de respectieve 76 byte limieten, met behulp van een afzonderlijke subroutine voor meer duidelijkheid.
    return splitLines (encoded.substring (0, encoded.length () - paddingCount) +"==".substring (0, paddingCount)) -} public static String splitLines (String string) {String lines = ""-voor (int i = 0- i < string.length () - i + = splitLinesAt) {lines + = string.substring (i, Math.min (string.length (), i + splitLinesAt)) - lines + = " r n r n"-} return lines-}
  • 9
    We kunnen, indien gewenst, een hoofdroutine toevoegen voor testdoeleinden. Dit is meestal een goed idee voordat u uw code publiceert voor openbare consumptie.
    public static void main (String [] args) {for (int i = 0- i < args.length- i ++) {System.err.println ("codering "" + args [i] + """) -System.out.println (coderen (args [i])) -}}
  • 10
    Hier is de voltooide module:

    openbare klasse Base64 {private static end String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"+ "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+ /"-private splitLinesAt static final int = 76-public static byte [] ZeroPad (int lengte byte [] bytes) {byte [] = new byte gevoerde [length] - // beginwaarde nul JVMSystem.arraycopy (bytes, 0, gewatteerd, 0, bytes.length) -Return padded-} public static String coderen (String string) {String gecodeerd = ""-byte [] stringArray-try {stringArray = string.getBytes ("UTF-8") - Passend gebruik encoding // snaar} catch (Exception genegeerd) {stringArray = String.getBytes () - // gebruik standaard locale in plaats van kwaken} // bepalen hoeveel bytes padding toe te voegen aan de outputint paddingCount = (3 - (stringArray.length% 3))% 3 - // voeg padding geven de noodzakelijke inputstringArray = ZeroPad (stringArray.length + paddingCount, stringArray) - // werkwijze 3 bytes per keer, karnen vier bytes uit // zorgen CRLF-invoegingen latervoor (int i = 0- i < stringArray.length- i + = 3) {int j = ((stringArray [i] & 0xff) << 16) + ((stringArray [i + 1] & 0xff) << 8) + (stringArray [i + 2] & 0xff) -gecodeerd = gecodeerd + base64code.charAt ((j >> 18) & 0x3f) + base64code.charAt ((j >> 12) & 0x3f) + base64code.charAt ((j >> 6) & 0x3f) + base64code.charAt (j & 0x3f) -} // vervang gecodeerde padnullen met "="return splitLines (encoded.substring (0, encoded.length () -paddingCount) + "==".substring (0, paddingCount)) -} public static String splitLines (String string) {String lines = ""-voor (int i = 0- i < string.length () - i + = splitLinesAt) {lines + = string.substring (i, Math.min (string.length (), i + splitLinesAt)) - lines + = " r n r n"-} return lines-} public static void main (String [] args) {for (int i = 0- i < args.length- i ++) {System.err.println ("codering "" + args [i] + """) -System.out.println (coderen (args [i])) -}}}
  • 11
    Laten we het nu compileren met javac, gcj, jikes of like- en proberen, met behulp van het Wikipedia-artikel Hobbes:
    $ gcj -C Base64.java $ java Base64 "De mens onderscheidt zich niet alleen door zijn verstand, maar door thissingular passie van andere dieren, dat is een lust van de geest, die door aperseverance van vreugde in het voortgezet en onvermoeibare generatie ofknowledge, hoger is dan de korte heftigheid van elk vleselijk genot."
  • 12
    Hier is het resultaat:

    codering "De mens onderscheidt zich niet alleen door zijn verstand, maar door de esta singularpassion van andere dieren, dat is een lust van de geest, die door aperseverance van vreugde in de voortdurende en onvermoeibare generatie ofknowledge, hoger is dan de korte heftigheid van elk vleselijk genot."TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4 =
  • 13
    Komt precies overeen! Dat betekent dat de twee programma`s verkeerd zijn, of beide zijn meer of minder goed. Op dit punt wilt u misschien het Wikipedia-artikel opnieuw bezoeken en de RFC-links lezen om te zien of we iets missen.
  • tips

    • Voel niet dat je altijd iets moet begrijpen voordat je het codeert. Dingen worden duidelijker naarmate je verder komt.
    • Hoewel het lezen van de relevante RFC`s noodzakelijk is voor het produceren van code, kan de overbelasting van informatie overweldigend zijn. Soms is de beste manier om de code ongedaan te maken voor wat u begrijpt, en dan terug te gaan om de functionaliteit punt voor punt te verifiëren bij het tellen de verplichte vereisten van de RFC`s.
    • Java is prima als algemene taal en voor apparaten zoals mobiele telefoons is dit wellicht de enige optie voor programmeurs, maar de syntaxis van jаvascript of Python lijkt misschien beknopter en krachtiger. Alle verschillende talen hebben hun eigen zwakheden en sterke punten.
    • Probeer de aanvullende code van de methode voor deze module te schrijven!
    Delen op sociale netwerken:

    Verwant
    Hoe een Java-venster in Swing te sluitenHoe een Java-venster in Swing te sluiten
    Hoe een Java-programma te compileren en uit te voeren met behulp van het `Systeem…Hoe een Java-programma te compileren en uit te voeren met behulp van het `Systeem…
    Hoe u uw Java_Home-pad in Ubuntu configureertHoe u uw Java_Home-pad in Ubuntu configureert
    Hoe u uw eerste Java-programma maakt in Ubuntu LinuxHoe u uw eerste Java-programma maakt in Ubuntu Linux
    Hoe een Java-applet te makenHoe een Java-applet te maken
    Hoe maak je een nieuw Java-project aan in EclipseHoe maak je een nieuw Java-project aan in Eclipse
    Hoe Java uit te schakelenHoe Java uit te schakelen
    Hoe een jar java-bestand uit te voerenHoe een jar java-bestand uit te voeren
    Hoe de som van twee getallen in Java te vindenHoe de som van twee getallen in Java te vinden
    Hoe een Java-programma te schrijven met twee klassen met behulp van EclipseHoe een Java-programma te schrijven met twee klassen met behulp van Eclipse
    » » Hoe te coderen in Base64 met Java
    © 2021 emkiset.ru