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