Base64 er en metode for koding hver 3 byte med innspill til fire byte med utgang, det er vanlig å kode bilder eller lyd for å sende inn e-post (selv om dagene av 7-biters overføringslinjer er det meste over), og en måte å skjule websiden autentisering (brukernavn og passord) fra tilfeldig innsyn. Her er et eksempel på hvordan å kode en Base64 encoder i Java, en multi-plattform programmeringsspråk. Dette eksemplet, og testen koding streng, er lånt fra Wikipedia-artikkel.
Trinn
- 1Skriv inn info og navn fil
- 2Start opp din editor, for eksempel notepad eller vi, og skriv forberedelsene, slik som klasse erklæring og kjente konstanter. Gi filen navnet Base64.java.
- 3De konstante verdier er spesifisert, slik artikkelen sier, i de relevante RFC. Det er et generelt en god idé lese alle relevante RFC før begynnelsen koding.
- Behandling av tegn som byte betyr at flerbytetegn, for eksempel japansk eller kinesisk, ikke vil være riktig kodet. Derfor må vi bruke getBytes ()-metoden String for å konvertere Unicode tegn i gjeldende nasjonal innstilling for å byte før kodingen starter. Men, for eksempel hvis du arbeider på en japansk dokument i en europeisk språk enn engelsk, må du angi nasjonal innstilling for produksjon av getBytes (), for eksempel getBytes ("UTF-8").
- La oss finne ut hvor mange padding bytes er nødvendig. Javas modulo operatør,%, kommer godt her. La oss også erklære delrutinenavnet og parametere mens vi holder på.
- Nå bruker vi denne verdien til null-pad innspill. Merk at hvis ingen padding er nødvendig, ingen ekstra, siden vi ta modulus av tre en gang, snu en tre inn i en 0.
public static byte [] zeroPad (int lengde, byte [] bytes) { byte [] polstret = new byte [lengde]; / / initialisert til null ved JVM System arraycopy (bytes, 0, polstret, 0, byte lengde.);. returnere polstret; } public static String kode (String streng) { String kodet = ""; byte [] stringArray; try { . stringArray = streng getBytes ("UTF-8"); / / bruker riktig koding streng! } Catch (Exception ignorert) { stringArray = streng getBytes ();. / / bruk locale standard snarere enn kvekke } int paddingCount = (3 - (stringArray. lengde% 3))% 3; stringArray = zeroPad (stringArray. lengde + paddingCount, stringArray);
- Nå får vi til kjøttet: pakking tre bytes om gangen i en 24-bits heltall, deretter trekke ut 6-bits indekser i koding streng. Disse tallene er ikke magi: 24 delt opp i seks nøyaktig fire ganger, og 6 bits kan holde verdier fra 0 til 63, som kan indeksere inn noen verdi i 64-byte koding streng.
for (int i = 0;. i <stringArray lengde; i + = 3) { int j = ((stringArray [i] & 0xff) << 16) + ((StringArray [i + 1] & 0xff) << 8) + (StringArray [i + 2] & 0xFF); kodet = kodet + base64code. Charat ((j >> 18) & 0x3F) + base64code. Charat ((j >> 12) og 0x3F) + base64code. Charat ((j >> 6) og 0x3F) + . base64code Charat (j & 0x3F); }
- 1Til slutt, pakke vi lysnivå etter padding det, ved å sette inn crlfs på de nødvendige 76-byte grenser, ved hjelp av en egen subrutine for klarhet.
retur splitLines (encoded. delstreng (0, kodet lengde () -. paddingCount) + . "==" Delstrengen (0, paddingCount)); } public static String splitLines (String streng) { Snorledninger = ""; for (int i = 0; i <strenglengde ();. i + = splitLinesAt) { linjer + = streng. delstrengen (i, Math. min (string. lengde (), + i splitLinesAt)); linjer + = "\ r \ n"; } returnere linjer; }
- 1Vi kan, hvis ønskelig, legge til en viktig rutine for testformål. Dette er vanligvis en god idé før du legger inn en kode for offentlig konsum.
public static void main (String [] args) { for (int i = 0; i <args lengde;. i + +) { . System err println ("encoding \" "+ args [i] +" \ "").; System out println (kode (args [i])).;. } }
- 1Her er det ferdige modulen:
public class Base64 { private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "Abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+ /"; private static final int splitLinesAt = 76; public static byte [] zeroPad (int lengde, byte [] bytes) { byte [] polstret = new byte [lengde]; / / initialisert til null ved JVM System arraycopy (bytes, 0, polstret, 0, byte lengde.);. returnere polstret; } public static String kode (String streng) { String kodet = ""; byte [] stringArray; try { . stringArray = streng getBytes ("UTF-8"); / / bruker riktig koding streng! } Catch (Exception ignorert) { stringArray = streng getBytes ();. / / bruk locale standard snarere enn kvekke } / / Avgjøre hvor mange padding bytes for å legge til output int paddingCount = (3 - (stringArray. lengde% 3))% 3; / / Legge til eventuelle nødvendige polstring til inngangen stringArray = zeroPad (stringArray. lengde + paddingCount, stringArray); / / Prosess 3 byte om gangen, churning ut fire utgang bytes / / Bekymre CRLF innsetting senere for (int i = 0;. i <stringArray lengde; i + = 3) { int j = ((stringArray [i] & 0xff) << 16) + ((StringArray [i + 1] & 0xff) << 8) + (StringArray [i + 2] & 0xFF); kodet = kodet + base64code. Charat ((j >> 18) & 0x3F) + base64code. Charat ((j >> 12) og 0x3F) + base64code. Charat ((j >> 6) og 0x3F) + . base64code Charat (j & 0x3F); } / / Bytt kodede padding nullverdier med "=" returnere splitLines (encoded. delstrengen (0, kodet lengde (). - . paddingCount) + "==" delstrengen (0, paddingCount)); } public static String splitLines (String streng) { Snorledninger = ""; for (int i = 0; i <strenglengde ();. i + = splitLinesAt) { linjer + = string delstreng (i, Math min (string. lengde (), i + splitLinesAt).).; linjer + = "\ r \ n"; } returnere linjer; } public static void main (String [] args) { for (int i = 0; i <args lengde;. i + +) { . System err println ("encoding \" "+ args [i] +" \ "").; System out println (kode (args [i])).;. } } }
- 1La oss kompilere den, ved hjelp av javac, gcj, jikes, eller lignende, og test ved hjelp av Hobbes sitat fra wikipedia artikkel:
Her er resultatet:
- 1Det samsvarer nøyaktig! Det betyr at enten begge programmene er galt, eller de er begge mer eller mindre rett. På dette punktet kan det være lurt å besøke Wikipedia-artikkelen, og les de koblede RFC for å se om vi savnet noe.
Tips
- Prøv å skrive følgesvenn dekode ()-metoden for denne modulen!
- Mens du leser relevante RFC er nødvendig for produksjonen koden, kan de opplysninger overbelastning være overveldende, noen ganger den beste måten er å skumme dem, kode i henhold til hva du forstår, og deretter gå tilbake og sjekke funksjonaliteten punkt-for-punkt mot RFC pliktige krav.
- Java er greit som et generelt språk, og for enheter som mobiltelefoner kan være en programmerer eneste alternativ, men du kan finne Javascript-tallet eller Python syntaks å være mer konsis og kraftig. Forskjellige språk har sine egne styrker og svakheter.
- Ikke føl at du alltid må forstå noe helt før koding. Ting blir klarere etterhvert.