Base64 er en kodningsmetode, der koder for hver 3 byte input til 4 bytes output - det bruges som regel til at kode billeder eller lyd til e-mail (selvom dagene med 7-bit transmissionslinjer er næsten væk ), og en måde at skjule sideautentificering (brugernavne og adgangskoder) fra eavesdroppers. Her er et eksempel på, hvordan man programmerer en Base64-encoder i Java, et programmeringssprog på tværs af platformen. Dette eksempel og testkodningsstrengen blev taget fra dette Wikipedia artiklen
Åbn din editor, såsom Notesblok eller vi, og indtast den foreløbige kode, som f.eks. Klassedeklarationen og de kendte konstanter. Ring til Base64.java-filen.
3
Disse konstante værdier er angivet som angivet i artiklen i de relevante RFC`er. Det er normalt en god idé at læse alle relevante RFC`er, før du starter kodningen.
public class Base64 {private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+ /" - privat statisk endelige int = splitLinesAt 76-
4
Behandling af tegnene som bytes betyder, at tegn med flere bytes, som japansk eller kinesisk, ikke vil være hardkodede. Derfor skal vi bruge metoden String getBytes () for at kunne konvertere Unicode-tegnene fra den aktuelle placering til bytes, inden kodningen begynder. Men for eksempel, hvis du arbejder på et dokument på et sted med japansk amerikansk engelsk, skal du angive placeringen af resultatet af getBytes () som getBytes ( "UTF-8").
5
Lad os finde ud af, hvor mange bytes polstring der kræves. Java-moduloperatøren,%, er nyttig her. Vi vil også erklære undernavnet og parametrene, siden vi er her.
6
Nu bruger vi den værdi til at udfylde indtastningen null. Bemærk, at hvis der ikke kræves polstring, vil der ikke tilføjes nogen polstring, da vi tog modulet 3 en anden gang og drej 3 til en 0.
public static byte [] zeroPad (int længde, byte [] bytes) {byte [] = ny byte polstret [længde] - // initialiseret til nul ved JVM System.arraycopy (byte 0, polstret, 0, bytes.length) - returnere padded- encode} public static streng (string streng) snor kodet = { "" - byte [] = stringArray- try {stringarray String.getBytes ( "UTF-8") - // bruge den relevante kode strengen! } Catch (Undtagelse ignoreret) = {stringarray String.getBytes () - // bruge standard placering i stedet paddingCount} = int (3 - (3 stringArray.length%))% 3 = stringarray zeroPad (+ stringArray.length paddingCount, stringArray) -
7
Nu hvor vi er kommet til påfyldningen: komprimerer tre byte ad gangen i et 24-bit heltal, og ekstrakter derefter 6-bit indekserne i kodningsstrengen. Disse tal er ikke magiske: 24 er divideret med 6 præcis 4 gange, og 6 bits kan gemme værdier fra 0 til 63, som kan indekseres til enhver værdi i en streng kodet i Base 64.
Endelig pakker vi resultatet efter at have udfyldt det ved at indsætte de nye linjer i de nødvendige 76-byte grænser ved hjælp af en separat subrutine for at gøre det tydeligere.
} offentlige statiske String splitLines (String-streng) {String lines = "" -for (int ()) {string_string (0, encoded.length () - paddingCount) i = 0- i < string.length()- i += splitLinesAt) {lines += string.substring(i, Math.min(string.length(), i +splitLinesAt))-lines += "rn"-}return lines-}
9
Vi kan, hvis vi vil, tilføje en hovedprøve rutine. Dette er normalt en god ide, før du sender koden til det offentlige forbrug.
public class Base64 {private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+ /" - private static final int splitLinesAt = 76-public static byte [] zeroPad (int længde, byte [] bytes) {byte [] = ny byte polstret [længde] - // initialiseret til nul ved JVMSystem.arraycopy (byte 0, polstret, 0, bytes.length) -Vend padded- encode} public static streng (string string) streng {kodede = "" -byte [] stringarray-prøve {stringarray String.getBytes = ( "UTF-8") -! // bruge kryptering strengen korrekt} fangst (Undtagelse ignoreret) = {stringarray String.getBytes () - // bruge standard placering i stedet} // bestemme, hvor mange bytes af polstring du vil føje til resultadoint paddingCount = (3 - (stringArray.length% 3))% 3 - // tilføje den nødvendige opfyldning i entradastringArray = zeroPad (stringArray.length + paddingCount, stringarray) - // proces 3 bytes ad gangen, hvilket skaber // 4-byte resultat bekymre sig om den nye række skær afterfor (int i = 0- i < stringArray.length- i += 3) {int j = ((stringArray[i] & 0xff) << 16) +((stringArray[i + 1] & 0xff) << 8) +(stringArray[i + 2] & 0xff)-encoded = encoded + base64code.charAt((j >> 18) 0x3f) + base64code.charAt ((j >> 12) 0x3f) + base64code.charAt ((j >> 6) 0x3f) + base64code.charAt (j 0x3f) -} // erstatte med nul fill "=" return splitLines (encoded.substring (0, encoded.length () -paddingCount) + "==" substring (0, paddingCount)) -.} Public static String splitLines (Strengstreng) {String lines = "" -for (int i = 0- i < string.length()- i += splitLinesAt) {lines += string.substring(i, Math.min(string.length(), i + splitLinesAt))-lines += "rn"-}return lines-}public static void main(String[] args) {for (int i = 0- i < args.length- i++) {System.err.println("encoding "" + args[i] + """)-System.out.println(encode(args[i]))-}}}
11
Lad os kompilere ved hjælp af javac, gcj, jikes eller en anden lignende compiler-og test, ved hjælp af Hobbes citat fra Wikipedia artiklen:
$ $ Java GCJ C Base64.java Base64 "Mennesket adskiller, ikke kun af hans grund, men ved thissingular lidenskab fra andre dyr, Hvilket er en begær i sindet, at ved aperseverance af glæde i den fortsatte generering og utrættelig ofknowledge, overstiger den korte hævelse af enhver kødlig fornøjelse. "
12
Her er resultatet:
kodning "Mennesket adskiller, ikke kun af hans grund, men ved denne singularpassion fra andre dyr, Hvilket er en begær i sindet, at ved aperseverance af glæde i den fortsatte og utrættelige generation ofknowledge, overstiger den korte heftighed af enhver kødelig fornøjelse. "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4 =
13
Video: Will YouTube Ever Run Out Of Video IDs?
Perfekt match! Det betyder enten, at begge programmer er forkerte, eller at de mere eller mindre er rigtige. På dette tidspunkt vil du måske gennemgå Wikipedia artiklen og læse RFC`erne for at se, om vi glemmer noget.
tips
Video: Google Chrome Developer Tools: 12 Tricks to Develop Quicker
Må ikke føle, at du altid har brug for at forstå noget helt før kodning. Ting kan blive klarere, når du programmerer.
Java er et godt sprog til almindelig programmering og for enheder såsom mobiltelefoner som den eneste mulighed for en programador- men du kan opleve, at syntaksen i jаvascript eller Python er mere koncis og kraftfuld. Forskellige sprog har deres egne kvaliteter og mangler.
Prøv at skrive decode () -metoden til dette modul!
Under læsning er de relevante RFC`er forpligtet til at fremstille koden, informationsbelastningen kan blive kvælende. Sommetider er den bedste måde at læse, kode efter hvad du forstår og derefter gå tilbage og tjekke peer-to-peer-funktionaliteten for at se opfylder RFC`s obligatoriske krav.