Wkuno

Hvordan å kode en streng til base64 med java

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

Hvordan å kode en streng til base64 med java. Skriv inn info og navn fil.
Hvordan å kode en streng til base64 med java. Skriv inn info og navn fil.
  1. 1
    Skriv inn info og navn fil
  2. 2
    Start opp din editor, for eksempel notepad eller vi, og skriv forberedelsene, slik som klasse erklæring og kjente konstanter. Gi filen navnet Base64.java.
  3. 3
    De 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);
 }
  1. 1
    Til 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;
 }
  1. 1
    Vi 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])).;.
 }
 }
  1. 1
    Her 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])).;.
 
 }
 
 }
 
 }
  1. 1
    La oss kompilere den, ved hjelp av javac, gcj, jikes, eller lignende, og test ved hjelp av Hobbes sitat fra wikipedia artikkel:

Her er resultatet:


  1. 1
    Det 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.

Relaterte artikler