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
1
Voer informatie en bestandsnaam in
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) -
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 Java te updaten
- Hoe een Java-venster in Swing te sluiten
- Hoe een Java-programma te compileren en uit te voeren met behulp van het `Systeem…
- Hoe u uw Java_Home-pad in Ubuntu configureert
- Hoe u uw eerste Java-programma maakt in Ubuntu Linux
- Hoe een Java-applet te maken
- Hoe maak je een nieuw Java-project aan in Eclipse
- Hoe Java uit te schakelen
- Hoe een jar java-bestand uit te voeren
- Hoe de som van twee getallen in Java te vinden
- Hoe een Java-programma te schrijven met twee klassen met behulp van Eclipse
- Hoe Java in te schakelen
- Hoe Java te installeren op Windows 8
- Hoe de Java Software Development Kit te installeren
- Hoe de Java Development Kit (JDK) op een Mac te installeren
- Hoe Java-spellen te installeren
- Hoe Java voor Android te krijgen
- Hoe de lengte van een tekenreeks in Java te krijgen
- Hoe een Java-ontwikkelaar op het hoogste niveau te worden
- Hoe een virus te maken
- Splitsen van strings in Java