Base64 is een werkwijze voor het coderen elke 3 bytes van inbreng in 4 bytes van de productie, het wordt gebruikt om beelden of audio coderen sturen mails (hoewel de dagen 7-bit transmissielijnen meestal over), en een manier om te verbergen webpagina authenticatie (gebruikersnamen en wachtwoorden) van ongewenst meekijken. Hier is een voorbeeld van hoe je een Base64 encoder in Java, een multi-platform programmeertaal coderen. Dit voorbeeld, en de test codering snaar, is ontleend aan de Wikipedia-artikel.
Stappen
- 1Voer info en de bestandsnaam
- 2Start de editor, zoals Kladblok of vi, en voer de voorrondes, zoals de klas aangifte en bekende constanten. Noem het bestand Base64.java.
- 3Die constante waarden worden gespecificeerd, zodat het artikel staat, in de relevante RFC's. Het is een over het algemeen een goed idee lees alle relevante RFC's vóór aanvang codering.
- Behandelen tekens als bytes betekent dat multibytetekens, zoals Japanse of Chinese, niet correct worden gecodeerd. Daarom moeten we de werkwijze String getBytes () gebruiken om de Unicode tekens van de huidige locale zetten in bytes voordat de codering start. Maar, bijvoorbeeld, als je werkt op een Japans document in een Europees Engels locale, moet u de locale op te geven voor de uitvoer van getBytes (), zoals getBytes ("UTF-8").
- Laten we eens kijken hoeveel padding bytes nodig zijn. Java's modulo operator,%, komt hier goed van pas. Laten we eveneens de naam en parameters subroutine terwijl we toch bezig zijn.
- Nu gebruiken we die waarde op null-pad van de ingang. Merk op dat als er geen opvulling nodig is, wordt niets toegevoegd, omdat we de modulus van 3 een tweede keer, het draaien van een 3 naar een 0.
public static byte [] zeroPad (int lengte, byte [] bytes) { byte [] gevoerde = new byte [lengte]; / / geïnitialiseerd op nul door JVM Systeem arraycopy (bytes, 0, gewatteerd, 0, bytes lengte.).; terug opgevuld; } public static String coderen (String string) { String gecodeerde = ""; byte [] stringArray; try { . stringArray = tekenreeks getBytes ("UTF-8"); / / Gebruik de juiste codering string! } Catch (Exception genegeerd) { stringArray = tekenreeks getBytes ();. / / gebruik locale standaard plaats kwaken } int paddingCount = (3 - (stringArray. lengte% 3)) 3%; stringArray = zeroPad (stringArray. lengte + paddingCount, stringArray);
- Nu komen we bij het vlees: inpakken drie bytes in een tijd in een 24-bits geheel getal, dan is het extraheren uit 6-bit indices in de codering string. Deze aantallen zijn niet magic: 24 verdeelt in 6 precies 4 keer, en 6 bits kan waarden vasthouden 0-63, welke kan indexeren in een waarde in de 64-byte codering string.
for (int i = 0;. i <stringArray lengte; i + = 3) { int j = ((stringArray [i] & 0xff) << 16) + ((StringArray [i + 1] & 0xff) << 8) + (StringArray [i + 2] & 0xff); gecodeerd = gecodeerde + base64code. charAt ((j >> 18) & 0x3f) + base64code. charAt ((j >> 12) & 0x3f) + base64code. charAt ((j >> 6) & 0x3f) + . base64code charAt (j & 0x3f); }
- 1Tot slot, we verpakken de uitgang, na te padden, door het invoegen crlfs op de gewenste 76-byte grenzen, met een aparte subroutine voor de duidelijkheid.
return splitLines (encoded. substring (0, gecodeerd lengte () -. paddingCount) + . "==" Substring (0, paddingCount)); } public static String splitLines (String string) { String lijnen = ""; for (int i = 0; i <string lengte ();. i + = splitLinesAt) { lijnen + = string. substring (i, Math. min. (string. lengte (), i + splitLinesAt)); lijnen + = "\ r \ n"; } terug lijnen; }
- 1We kunnen, indien gewenst, voeg een hoofdprogramma voor testdoeleinden. Dit is meestal een goed idee voordat je een bericht iemands code voor publieke consumptie.
public static void main (String [] args) { for (int i = 0; i <args lengte;. i + +) { . Systeem err println ("encoding \" "+ args [i] +" \ "").; System out println (coderen (args [i]))..; } }
- 1Hier is de afgewerkte module:
public class Base64 { private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "Abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+ /"; private static final int splitLinesAt = 76; public static byte [] zeroPad (int lengte, byte [] bytes) { byte [] gevoerde = new byte [lengte]; / / geïnitialiseerd op nul door JVM Systeem arraycopy (bytes, 0, gewatteerd, 0, bytes lengte.).; terug opgevuld; } public static String coderen (String string) { String gecodeerde = ""; byte [] stringArray; try { . stringArray = tekenreeks getBytes ("UTF-8"); / / Gebruik de juiste codering string! } Catch (Exception genegeerd) { stringArray = tekenreeks getBytes ();. / / gebruik locale standaard plaats kwaken } / / Bepalen hoeveel padding bytes aan de uitgang int paddingCount = (3 - (stringArray. lengte% 3)) 3%; / / Voeg eventueel noodzakelijke opvulling aan de ingang stringArray = zeroPad (stringArray. lengte + paddingCount, stringArray); / / Proces 3 bytes per keer, karnen 4 uitgang bytes / / Maken over CRLF inserties later for (int i = 0;. i <stringArray lengte; i + = 3) { int j = ((stringArray [i] & 0xff) << 16) + ((StringArray [i + 1] & 0xff) << 8) + (StringArray [i + 2] & 0xff); gecodeerd = gecodeerde + base64code. charAt ((j >> 18) & 0x3f) + base64code. charAt ((j >> 12) & 0x3f) + base64code. charAt ((j >> 6) & 0x3f) + . base64code charAt (j & 0x3f); } / / Vervang gecodeerde padding nulls met "=" terug splitLines (encoded. substring (0, gecodeerd lengte (). - . paddingCount) + "==" substring (0, paddingCount)); } public static String splitLines (String string) { String lijnen = ""; for (int i = 0; i <string lengte ();. i + = splitLinesAt) { lijnen + = tekenreeks substring (i, Math min (string. lengte (), i + splitLinesAt).).; lijnen + = "\ r \ n"; } terug lijnen; } public static void main (String [] args) { for (int i = 0; i <args lengte;. i + +) { . Systeem err println ("encoding \" "+ args [i] +" \ "").; System out println (coderen (args [i]))..; } } }
- 1Laten we het compileren, gebruik javac, gcj, jikes of dergelijke, en testen, met behulp van de hobbes citaat uit het wikipedia artikel:
Hier is het resultaat:
- 1Het past precies! Dat betekent ofwel beide programma's verkeerd zijn, of ze zijn allebei min of meer gelijk. Op dit punt wil je misschien het Wikipedia artikel opnieuw, en lees de gekoppelde RFC's om te zien of we iets gemist.
Tips
- Probeer het schrijven van de metgezel decode ()-methode voor deze module!
- Tijdens het lezen van relevante RFC's is noodzakelijk voor de productie-code, kan de informatie overload overweldigend zijn, soms de beste manier is om ze te romen, code op basis van wat je begrijpt, en ga dan terug en controleer de functionaliteit punt-voor-punt tegen de RFC's verplicht vereisten.
- Java is oke als een algemeen doel taal, en voor apparaten zoals mobiele telefoons kan enige optie een programmeur zijn, maar je zou kunnen vinden Javascript of syntax Python's te bondiger en krachtiger. Verschillende talen hebben hun eigen sterke en zwakke punten.
- Heb niet het gevoel dat je altijd iets compleet te begrijpen voordat codering. Dingen duidelijker als je verder gaat.