Wku

Hur man koda en sträng till base64 med java

Base64 är en metod för att koda varje 3 bytes av inmatning till 4 byte av produktionen, det är vanligt att koda bilder eller ljud för att skicka in e-post (även de dagar av 7-bitars kraftledningar är mestadels över), och ett sätt att dölja webbsida autentisering (användarnamn och lösenord) från casual snokande. Här är ett exempel på hur man kan koda en Base64 encoder i Java, en multi-plattform programmeringsspråk. Detta exempel, och testet kodande strängen, är lånad från Wikipedia artikeln.

Steg

Hur man koda en sträng till base64 med java. Ange info och namnet fil.
Hur man koda en sträng till base64 med java. Ange info och namnet fil.
  1. 1
    Ange info och namnet fil
  2. 2
    Starta upp din redaktör, till exempel Anteckningar eller VI, och ange de förberedelser som klassdeklarationen och kända konstanter. Döp filen Base64.java.
  3. 3
    Dessa konstanta värden anges, så artikeln påstår, i relevanta RFC: er. Det är ett generellt en bra idé läst alla relevanta RFC innan du påbörjar kodning.
  
  • Behandla tecken som byte innebär att multibytetecken, som japanska eller kinesiska, kommer inte riktigt att kodas. Därför måste vi använda getBytes () för String för att konvertera Unicode-tecken i den aktuella lokalen till byte innan kodningen påbörjas. Men, till exempel, om du arbetar på en japansk dokument i en europeisk engelsk språkversion, måste du ange lokalen för utgången av getBytes (), såsom getBytes ("UTF-8").
  • Låt oss ta reda på hur många stoppning byte behövs. Javas modulo operatör,%, kommer väl till pass här. Låt oss också uppge namnet på en subrutin och parametrar medan vi ändå håller på.
  • Nu använder vi det värdet till null-pad ingången. Observera att om ingen utfyllnad behövs, ingen tillsattes, eftersom vi tar modulen för 3 en andra gång, svarvning en 3 in i en 0.
  public static byte [] zeroPad (int längd, byte [] bytes) {  byte [] vadderad = new byte [längd], / / initieras till noll genom JVM  System arraycopy (byte, 0, vadderade, 0, bytes längd.).;  returnera vadderat;  }  public static String koda (String String) {  String kodat = "";  byte [] stringArray;  try { . stringArray = string getBytes ("UTF-8"), / / använder lämplig kodning string!  } Catch (Exception ignoreras) {  stringArray = string getBytes ();. / / använda locale standard snarare än kraxande  }  int paddingCount = (3 - (stringArray. längd% 3))% 3;  stringArray = zeroPad (stringArray. längd + paddingCount, stringArray); 
  • Nu får vi till köttet: packning tre byte i taget i ett 24-bitars heltal, sedan extrahera ut 6-bitars index i den kodande strängen. Dessa siffror är inte magi: 24 delas i 6 exakt 4 gånger, och 6 bitar kan hålla värden från 0 till 63, vilket kan indexera in något värde i den 64-Byte-kodning strängen.
  for (int i = 0;. i. <stringArray längd, i + = 3) {  int j = ((stringArray [i] & 0xff) << 16) +  ((StringArray [i + 1] & 0xff) << 8) +   (StringArray [i + 2] & 0xff);  kodade = kodad + base64code. charAt ((j >> 18) & 0x3f) +  base64code. charAt ((j >> 12) & 0x3f) +  base64code. charAt ((j >> 6) & 0x3f) + . base64code charAt (j & 0x3f);  } 
  1. 1
    Slutligen, paketerar vi produktionen, efter vaddering det, genom att sätta crlfs vid de erforderliga 76-byte gränser, med hjälp av en separat subrutin för tydlighet.
  återvändande splitLines (encoded. delsträng (0, kodat längd () -. paddingCount) + . "==" Delsträng (0, paddingCount));  }  public static String splitLines (String string) {  String rader = "";  for (int i = 0; I <string length (),. i + = splitLinesAt) {  linjer + = string. substring (i, Math. min (string. längd (), + i   splitLinesAt));  linjer + = "\ r \ n";  }  returnera rader;  } 
  1. 1
    Vi kan, om så önskas, tillsätt en huvudrutin för provningsändamål. Detta är oftast en bra idé innan du postar en kod för offentlig konsumtion.
  public static void main (String [] args) {  for (int i = 0; i <args längd,. i + +) { . System fela println ("kodning \" "+ args [i] +" \ "").;  System ut println (koda (args [i]))..;  }  } 
  1. 1
    Här är den färdiga modulen:
  public class Base64 {    private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"  + "Abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+ /";    private static final int splitLinesAt = 76;    public static byte [] zeroPad (int längd, byte [] bytes) {  byte [] vadderad = new byte [längd], / / initieras till noll genom JVM  System arraycopy (byte, 0, vadderade, 0, bytes längd.).;  returnera vadderat;  }    public static String koda (String String) {    String kodat = "";  byte [] stringArray;  try { . stringArray = string getBytes ("UTF-8"), / / använder lämplig kodning string!  } Catch (Exception ignoreras) {  stringArray = string getBytes ();. / / använda locale standard snarare än kraxande  }  / / Avgöra hur många stoppning byte att lägga till utgången  int paddingCount = (3 - (stringArray. längd% 3))% 3;  / / Tillfoga någon nödvändig utfyllnad till ingången  stringArray = zeroPad (stringArray. längd + paddingCount, stringArray);  / / Process 3 byte i taget, spottar ur 4 output byte  / / Oroa CRLF infogningar senare  for (int i = 0;. i. <stringArray längd, i + = 3) {  int j = ((stringArray [i] & 0xff) << 16) +  ((StringArray [i + 1] & 0xff) << 8) +   (StringArray [i + 2] & 0xff);  kodade = kodad + base64code. charAt ((j >> 18) & 0x3f) +  base64code. charAt ((j >> 12) & 0x3f) +  base64code. charAt ((j >> 6) & 0x3f) + . base64code charAt (j & 0x3f);  }  / / Byt kodade stoppning nollor med "="  returnera splitLines (encoded. delsträng (0, kodat längd (). - . paddingCount) + "==" delsträng 0 (, paddingCount));    }  public static String splitLines (String string) {    String rader = "";  for (int i = 0; I <string length (),. i + = splitLinesAt) {    linjer + = string substring (i, Math min (string. längd (), i + splitLinesAt).).;  linjer + = "\ r \ n";    }  returnera rader;    }  public static void main (String [] args) {    for (int i = 0; i <args längd,. i + +) {   . System fela println ("kodning \" "+ args [i] +" \ "").;  System ut println (koda (args [i]))..;    }    }    } 
  1. 1
    Låt oss sammanställa det, med javac, gcj, jikes, eller liknande, och test med hjälp av hobbes citat från wikipedia artikeln:
  

Här är resultatet:

  
  1. 1
    Den matchar exakt! Det innebär antingen båda programmen är fel, eller att de är båda mer eller mindre rätt. Vid det här laget kanske du vill återkomma till Wikipedia artikeln och läs de länkade RFC för att se om vi missat något.

Tips

  • Försök skriva följeslagare decode () metoden för denna modul!
  • När du läser relevanta RFC är nödvändigt för produktion kod, kan information overload vara överväldigande, ibland det bästa sättet är att skumma dem, kod enligt vad ni förstår, och sedan gå tillbaka och kontrollera funktionen punkt för punkt mot RFC: s obligatoriska krav.
  • Java är okej som ett allmänt ändamål språk, samt för enheter som mobiltelefoner kan vara en programmerare enda alternativet, men du kanske hittar Javascript: s eller Pythons syntax för att vara mer kortfattad och kraftfull. Olika språk har sina egna styrkor och svagheter.
  • Tycker inte att du alltid måste förstå något helt innan kodning. Saker och ting blir tydligare när du går längs.

Relaterade artiklar