Base64 ist eine der häufigsten Codierungsmethoden im Netzwerk für die Übertragung von 8 -Bit -Byte -Code. Sie können RFC2045 ~ RFC2049 überprüfen, das detaillierte MIME -Spezifikationen enthält. Basis64 erfordert, dass alle drei 8 -Bit -Bytes in vier 6 -Bit -Bytes (3*8 = 4*6 = 24) umgewandelt werden, und dann zwei hohe 0S bis 6 -Bit hinzuzufügen, um vier 8 -Bit -Bytes zu bilden. Mit anderen Worten, die konvertierte Zeichenfolge ist theoretisch 1/3 länger als die ursprüngliche.
PHP -Funktionen: Base64_Codode () und Base64_Decode ()
Base64 Codierung, Dekodierungsprinzip
Basis64-Codierung wandelt tatsächlich 3 8-Bit-Bytes in 4 6-Bit-Bytes um (3*8 = 4*6 = 24) Diese 4 Sechs-Bit-Bytes sind tatsächlich noch 8-Bit, aber die höheren zwei Bits sind auf 0 gesetzt. Wenn nur 6 Bits eines Byte gültig sind, ist der Wert von 0 bis 2 bis 2 MINUS 1 bis 6. (0 ~ 63).
Tatsächlich gibt es im ASCII -Code zwischen 0 und 63 viele unsichtbare Zeichen
'A' ~ 'z'? ASCII (0 ~ 25)
'a' ~ 'z'? ASCII (26 ~ 51)
'0' ~ '9'? ASCII (52 ~ 61)
''? ASCII (62)
'/'? ASCII (63)
Dadurch werden 3 8-Bit-Bytes in 4 sichtbare Zeichen umwandelt.
Die spezifische Methode der Byte-Spaltung lautet: (Abbildung (schlecht gezeichnet, den Geist verstehen :-))
AAAAAABB CCCDDDDDDE EEFFFFFFFFFFFFFFFFFFEF IST MIT 1 oder 0. Um eindeutig zu sehen, verwenden Sie stattdessen Abcdef
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Byte 1 Byte 2 Byte 3
||
//
00aaaaaa 00BBBCCCC 00DDDEE 00ffffffs
Hinweis: Die obigen drei Byte -Bits sind Originaltext, die folgenden vier Bytes sind Basis64 -Codierung und die ersten beiden Bits sind 0.
Bei der Aufteilung auf diese Weise sollte die Anzahl der Bytes im Originaltext ein Vielfaches von 3 sein. Wenn diese Bedingung nicht erfüllt werden kann, verwenden Sie alle Null -Bytes
Komplement wird beim Konvertieren die Basis64 -Codierung durch = Zeichen ersetzt, weshalb einige Base64 -Codierungen mit ein oder zwei gleichen Vorzeichen beendet werden.
Der Grund für das Bündel, aber es gibt höchsten
Tabelle Rest
F (verbleiben) = f (Ursprung) Mod 3 wird festgelegt.
Daher betragen die möglichen Werte von F (Rest) 0, 1, 2.
Wenn n = [f (Ursprung) f (Rest)] / 3
Wenn f (verbleiben) = 0, wird es in 4*n Bytes Base64 -Codierung umgewandelt.
Wenn f (verbleiben) = 1, da ein wörtliches Byte in zwei Basis 64-kodierte Bytes aufgeteilt werden kann
Sei Base64 codieren ein Vielfaches von 4, so dass es mit 2 gleichen Vorzeichen ergänzt werden sollte.
Wenn f (verbleiben) = 2, da die beiden Originaltext-Bytes in ähnlicher Weise in 3 Base64-kodierte Bytes aufgeteilt werden können, können
Ein gleiches Zeichen sollte hinzugefügt werden.
Base64 Es gibt 0 bis 2 gleiche Zeichen am Ende der codierten Zeichenfolge. Diese gleichen Anzeichen sind für die Dekodierung nicht erforderlich, sodass sie gelöscht werden können.
Wenn das Netzwerk -Get- und Post -Parameter -Listen aufgeführt ist, kann '+' nicht normal übertragen werden, sodass Sie es durch '|' ersetzen können.
Auf diese Weise haben die von Basis codierten Strings nur '|' und '/', sodass die Base64-kodierten Zeichenfolgen als Parameterlisten mit Parameterwerten übertragen werden können
=====================================================================ieben
Das Folgende ist eine Implementierung von Ausländern:
Paket com.meterware.httpunit;
/*********
* $ Id: Base64.java, v 1.4 2002/12/24 15:17:17 Russgold Exp $
*
* Copyright (C) 2000-2002 von Russell Gold
*
* Die Erlaubnis wird hiermit kostenlos an eine Person erteilt, die eine Kopie dieser Software erhält und zugeordnet ist
* Dokumentationsdateien (die "Software"), um die Software ohne Einschränkungen, einschließlich ohne Einschränkung
!
* Um Personen zuzulassen, denen die Software dazu vorliegt, unter den folgenden Bedingungen:
*
* Die oben genannte Urheberrechtsbekanntmachung und diese Berechtigungsbekanntmachung sind in allen Kopien oder wesentlichen Teilen enthalten
* der Software.
*
* Die Software wird "so wie" ohne Garantie jeglicher Art, ausdrücklich oder stillschweigend bereitgestellt, einschließlich, aber nicht beschränkt auf
* Die Gewährleistung der Marktgängigkeit, der Eignung für einen bestimmten Zweck und Nichtverletzung. In keinem Fall die
* Autoren oder Urheberrechtsinhaber haften für Ansprüche, Schäden oder andere Haftungen, sei es in einer Aktion von
* Vertrag, unerlaubte Handlung oder auf andere Weise, aus oder im Zusammenhang mit der Software oder der Verwendung oder anderer
* Geschäfte in der Software.
*
******************************************************************************************************************************************************
/**
* Eine Versorgungsklasse zum Umzug in und von der Basis 64 -Codierung.
*
* @Author <a href = "mailto: [email protected]"> Russell Gold </a>
**//
public class base64 {endgültig static String codingchar = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/"; /*** Gibt das codierte Äquivalent einer gelieferten String von Basis 64 zurück. * @Param Source Die zu codierende Zeichenfolge */ public static String codem (String Source) {char [] SourceByTes = getPaddedBytes (Quelle); int numGroups = (SourceBytes.Length + 2) / 3; char [] targetBytes = new char [4]; char [] target = new char [4 * numGroups]; für (int Group = 0; Gruppe <NumGroups; Gruppe ++) {convert3to4 (SourceBytes, Group*3, TargetBytes); für (int i = 0; i <targetBytes.length; i ++) {target [i+4*gruppe] = codingchar.charat (targetBytes [i]); }} int numpadBytes = socryBytes.length - source.length (); für (int i = target.length-numpadBytes; i <target.length; i ++) target [i] = '='; Neue Zeichenfolge zurückgeben (Ziel); } private static char [] getPaddedBytes (String Source) {char [] Converted = source.toCharArray (); int benötigte Länge = 3 * ((konvertiert.Length+2) /3); char [] result = new char [fordersLength]; System.ArrayCopy (konvertiert, 0, Ergebnis, 0, konvertiert.Length); Rückgabeergebnis; } private static void convert3to4 (char [] Quelle, int SourceIndex, char [] target) {target [0] = (char) (Quelle [SourceIndex] >> 2); Ziel [1] = (char) (((Quelle [SourceIndex] & 0x03) <<4) | (Quelle [SourceIndex+1] >>> 4)); Ziel [2] = (char) (((Quelle [SourceIndex+1] & 0x0f) <<2) | (Quelle [SourceIndex+2] >>> 6)); Ziel [3] = (char) (Quelle [SourceIndex+2] & 0x3f); } /*** Gibt das Klartextäquivalent einer Basis 64-kodierte Zeichenfolge zurück. * @Param Source Eine Basis 64 -String (die ein Vielfaches von 4 Zeichen haben muss) */ public static String Decode (String Source) {if (Quelle.Length ()%4! = 0) Werfen Sie neue RunTimeException ("Gültiges Basis64 -Codes haben ein Vielfaches von 4 Zeichen"); int numGroups = source.length () / 4; int numextrabytes = source.endswith ("==")? 2: (Source.endswith ("=")? 1: 0); byte [] targetBytes = new Byte [3*numGroups]; byte [] SourceBytes = neues Byte [4]; für (int Group = 0; Gruppe <NumGroups; Gruppe ++) {für (int i = 0; i <SourceBytes.length; i ++) {SourceBytes [i] = (byte) math.max (0, codingchar.indexof (scry.charat (4*Gruppe)); } convert4to3 (SourceBytes, TargetBytes, Group*3); } return New String (targetBytes, 0, targetBytes.length - numextrabytes); } private static void convert4to3 (Byte [] Quelle, Byte [] target, int targetIndex) {target [targetIndex] = (byte) ((Quelle [0] <2) | (Quelle [1] >> 4)); Ziel [targetIndex+1] = (byte) (((Quelle [1] & 0x0f) <<4) | (Quelle [2]> >> 2)); Ziel [targetIndex+2] = (byte) (((Quelle [2] & 0x03) <<6) | (Quelle [3])); }}