Base64 er en metode til kodning hver 3 bytes af input til 4 byte output, det er almindeligt anvendt til at indkode fotos eller lyd til at sende i e-mails (selvom de dage af 7-bit transmissionslinjer er for det meste over), og en måde at skjule webside godkendelse (brugernavne og adgangskoder) fra tilfældig snagen. Her er et eksempel på, hvordan man kode en Base64 encoder i Java, en multi-platform programmeringssprog. Dette eksempel, og testen kodning streng, er lånt fra Wikipedia artiklen.
Steps
- 1Indtast info og navnefil
- 2Start din editor, såsom Notesblok eller Vi, og indtast de indledende kampe, såsom klasse erklæring og kendte konstanter. Navngiv filen Base64.java.
- 3Disse konstante værdier er angivet, så artiklen hedder det i de relevante RFC'er. Det er en generelt en god idé læse alle relevante RFC'er, før du begynder kodning.
- Behandling figurer som byte betyder, at multibyte tegn, såsom japansk eller kinesisk, ikke bliver korrekt kodet. Derfor skal vi bruge getBytes () metode for String med henblik på at konvertere Unicode-tegn i den nuværende locale til bytes, før kodning begynder. Men for eksempel, hvis du arbejder på en japansk dokument i en europæisk engelsk locale, bliver du nødt til at specificere locale for produktionen af getBytes (), såsom getBytes ("UTF-8").
- Lad os finde ud af hvor mange Udfyldningsbytes er nødvendige. Javas modulo operatør%, kommer i handy her. Lad os også erklære subrutine navn og parametre, mens vi er ved det.
- Nu bruger vi denne værdi til nul-pad input. Bemærk, at hvis ingen udfyldning er nødvendig, er ikke tilsættes, da vi tager modulus for 3 en anden gang, dreje en 3 til en 0.
public static byte [] zeroPad (int længde, byte [] bytes) { byte [] polstret = new byte [længde] / / initialiseres til nul ved JVM System arraycopy (bytes, 0, polstrede, 0 bytes længde.).; returnere polstret; } public static String indkode (String string) { String kodede = ""; byte [] stringarray; try { . stringarray = string getBytes ("UTF-8") / / Brug passende kodning string! } Catch (Exception ignoreret) { stringarray = string getBytes ();. / / brug locale standard snarere end kvækker } int paddingCount = (3 - (stringArray. længde% 3))% 3; stringarray = zeroPad (stringArray. længde + paddingCount, stringarray);
- Nu får vi at kødet: pakning tre bytes ad gangen i en 24-bit heltal, så udtrække ud 6-bit indeks i kodning streng. Disse tal er ikke magi: 24 deler sig i 6 præcis 4 gange, og 6 bits kan holde værdier fra 0 til 63, som kan indeksere ind nogen værdi i 64-byte kodning streng.
for (int i = 0;. i <stringarray længde 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) & 0x3f) + base64code. charAt ((j >> 6) & 0x3f) + . base64code charAt (j & 0x3f); }
- 1Endelig vi pakke output, efter polstring det, ved at indsætte crlfs på de krævede 76-byte grænser, ved hjælp af en særskilt subrutine for klarhed.
retur splitLines (encoded. substring (0, kodet længde () -. paddingCount) + . "==" Delstreng (0, paddingCount)); } public static String splitLines (String streng) { String linier = ""; for (int i = 0; i <string længde (). i + = splitLinesAt) { linier + = streng. substring (i, Math. min (string. længde (), i + splitLinesAt)); linier + = "\ r \ n"; } returnere linjer; }
- 1Vi kan, hvis det ønskes, tilsættes en hovedrutine til testformål. Dette er normalt en god idé, før du sender en kode for det offentlige forbrug.
public static void main (String [] args) { for (int i = 0; i <args længde. i + +) { . System err println ("encoding \" "+ args [i] +" \ "").; System ud println (indkode (args [i]))..; } }
- 1Her er det færdige modul:
public class Base64 { private statisk endelig String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "Abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+ /"; private statisk endelig int splitLinesAt = 76; public static byte [] zeroPad (int længde, byte [] bytes) { byte [] polstret = new byte [længde] / / initialiseres til nul ved JVM System arraycopy (bytes, 0, polstrede, 0 bytes længde.).; returnere polstret; } public static String indkode (String string) { String kodede = ""; byte [] stringarray; try { . stringarray = string getBytes ("UTF-8") / / Brug passende kodning string! } Catch (Exception ignoreret) { stringarray = string getBytes ();. / / brug locale standard snarere end kvækker } / / Afgøre, hvor mange Udfyldningsbytes at føje til output int paddingCount = (3 - (stringArray. længde% 3))% 3; / / Add enhver nødvendig polstring til input stringarray = zeroPad (stringArray. længde + paddingCount, stringarray); / / Proces 3 byte ad gangen, spytter 4 output bytes / / Bekymre sig om CRLF indrykninger senere for (int i = 0;. i <stringarray længde 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) & 0x3f) + base64code. charAt ((j >> 6) & 0x3f) + . base64code charAt (j & 0x3f); } / / Udskift indkodede polstring nuller med "=" returnere splitLines (encoded. substring (0, kodet længde (). - . paddingCount) + "==" delstreng (0, paddingCount)); } public static String splitLines (String streng) { String linier = ""; for (int i = 0; i <string længde (). i + = splitLinesAt) { linier + = string substring (i, Math min (string. længde (), i + splitLinesAt.)).; linier + = "\ r \ n"; } returnere linjer; } public static void main (String [] args) { for (int i = 0; i <args længde. i + +) { . System err println ("encoding \" "+ args [i] +" \ "").; System ud println (indkode (args [i]))..; } } }
- 1Lad os kompilere det, ved hjælp javac, gcj, jikes eller lignende, og test under anvendelse af Hobbes citat fra Wikipedia-artiklen:
Her er resultatet:
- 1Det matcher præcist! Der enten betyder begge programmer er forkerte, eller de er begge mere eller mindre rigtige. På dette tidspunkt er du måske ønsker at gense Wikipedia-artiklen, og læse de linkede RFC'er at se, hvis vi savnede noget.
Tips
- Prøv at skrive følgesvend afkode () metode til dette modul!
- Mens du læser de relevante RFC'er er nødvendig for produktionen kode, kan de oplysninger overload være overvældende, nogle gange den bedste måde er at skimme dem, kode efter hvad du forstår, og derefter gå tilbage og kontrollere funktionaliteten point-by-point mod RFC obligatoriske krav.
- Java er okay som en generel sprog og til enheder som mobiltelefoner kan være en programmør eneste mulighed, men du kan finde Javascript eller Pythons syntaks til at være mere kortfattet og kraftfuld. Forskellige sprog har deres egne styrker og svagheder.
- Må ikke føler, at du altid nødt til at forstå noget helt før kodning. Tingene bliver klarere som du går sammen.