Base64 est l'une des méthodes de codage les plus courantes du réseau pour transmettre du code d'octets à 8 bits. Vous pouvez vérifier RFC2045 ~ RFC2049, qui contient des spécifications de mime détaillées. Base64 nécessite la conversion de tous les trois octets 8 bits en quatre octets 6 bits (3 * 8 = 4 * 6 = 24), puis ajoutant deux 0s élevés à 6 bits pour former quatre octets 8 bits. En d'autres termes, la chaîne convertie sera théoriquement 1/3 plus longue que celle d'origine.
Fonctions PHP: base64_encode () et base64_decode ()
Base64 Encodage, principe de décodage
Le codage de base64 convertit en fait 3 octets 8 bits en 4 octets 6 bits, (3 * 8 = 4 * 6 = 24) Ces 4 octets six bits sont en fait encore 8 bits, mais les deux bits supérieurs sont définis à 0. (0 ~ 63).
En fait, il existe de nombreux caractères invisibles dans le code ASCII entre 0 et 63, donc une autre cartographie doit être effectuée, et le tableau de mappage est
'A' ~ 'z'? Ascii (0 ~ 25)
'a' ~ 'z'? ASCII (26 ~ 51)
'0' ~ '9'? ASCII (52 ~ 61)
''? ASCII (62)
'/'? ASCII (63)
Cela convertira 3 octets 8 bits en 4 caractères visibles.
La méthode spécifique de division des octets est: (Figure (mal dessiné, comprendre l'esprit :-))
AAAAAABB CCCDDDD EEFFFFFF // ABCDEF est en fait 1 ou 0. Pour voir clairement, utilisez ABCDEF à la place
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Octet 1 octet 2 octet 3
||
//
00AAAAAA 00BBCCCC 00DDDEE 00FFFFFF
Remarque: Les bits de trois octets ci-dessus sont du texte d'origine, les quatre octets suivants sont le codage de base64 et les deux premiers bits sont 0.
Lorsque vous divisez de cette façon, le nombre d'octets dans le texte d'origine doit être un multiple de 3. Lorsque cette condition ne peut pas être remplie, utilisez tous les octets zéro
Complément, lors de la conversion, le codage de la base64 est remplacé par = Sign, c'est pourquoi certains codages de base64 sont terminés par un ou deux signes égaux.
La raison du bundle, mais il y a au plus deux signes égaux, car: si F (Origin) représente le nombre d'octets dans le texte d'origine, F (reste) est utilisé pour
Tableau reste, alors
F (restez) = f (origine) mod 3 est établi.
Par conséquent, les valeurs possibles de f (restent) sont 0, 1, 2.
Si n = [f (origine) f (restez)] / 3
Lorsque f (reste) = 0, il est converti en codage 4 * n octets Base64.
Lorsque f (reste) = 1, puisque un octet littéral peut être divisé en deux octets codés en base de base64, afin de
Soit la base64 encoder être un multiple de 4, il doit donc être complété avec 2 signes égaux.
Lorsque f (reste) = 2, puisque les deux octets de texte originaux peuvent être divisés en 3 octets codés en base64, de même,
Un signe égal doit être ajouté.
Base64 Il y aura 0 à 2 signes égaux à la fin de la chaîne codée. Ces signes égaux ne sont pas nécessaires au décodage, ils peuvent donc être supprimés.
Lorsque les listes de paramètres Get et Post sont répertoriées, '+' ne peut pas être transmise normalement, vous pouvez donc la remplacer par '|'
De cette façon, les chaînes codées par la base64 n'ont que «|» et '/', de sorte que les chaînes codées de base64 peuvent être transférées comme listes de paramètres avec des valeurs de paramètre
========================================================================================================================.
Ce qui suit est une mise en œuvre écrite par des étrangers:
package com.meterware.httpunit;
/ ********************************************************************************************************************.
* $ Id: base64.java, v 1.4 2002/12/24 15:17:17 Russgold Exp $
*
* Copyright (C) 2000-2002 par Russell Gold
*
* L'autorisation est accordée gratuitement par la présente à toute personne obtenant une copie de ce logiciel et associée
* Fichiers de documentation (le "logiciel"), pour traiter dans le logiciel sans restrictions, y compris sans limitation
* Les droits d'utilisation, de copie, de modification, de fusion, de publication, de distribution, de sous-licence et / ou de vente de copies du logiciel, et
* Pour permettre aux personnes auxquelles le logiciel est fourni pour le faire, sous réserve des conditions suivantes:
*
* L'avis de droit d'auteur ci-dessus et le présent avis d'autorisation doivent être inclus dans toutes les copies ou parties substantielles
* du logiciel.
*
* Le logiciel est fourni "tel quel", sans garantie d'aucune sorte, express ou implicite, y compris mais sans s'y limiter
* Les garanties de qualité marchande, d'adéquation à un usage particulier et de non-contrefaçon. En aucun cas le ne doit
* Les auteurs ou les détenteurs de droits d'auteur sont responsables de toute réclamation, dommage ou autre responsabilité, que ce soit dans une action de
* Contrat, délit ou autre, découlant de, hors de ou en relation avec le logiciel ou l'utilisation ou autre
* TRAVAILLES DANS LE LOGICIEL.
*
**********************************************************************************************************************************************************************************************.
/ **
* Une classe d'utilité à convertir vers et depuis le codage de la base 64.
*
* @author <a href = "Mailto: [email protected]"> russell Gold </a>
** /
Classe publique Base64 {Final Static String EncodingChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 + /"; / ** * Renvoie l'équivalent codé de base 64 d'une chaîne fournie. * @param source la chaîne pour encoder * / public static String Encode (String Source) {char [] sourceBytes = getPaddedBytes (source); int numgroups = (SourceBytes.Length + 2) / 3; char [] cibleBytes = new Char [4]; char [] cible = new char [4 * numgroups]; pour (int groupe = 0; groupe <numgroups; groupe ++) {convert3to4 (sourceBytes, groupe * 3, cibleBytes); for (int i = 0; i <cibleBytes.length; i ++) {cible [i + 4 * groupe] = codingchar.charat (cibleBytes [i]); }} int numpadbytes = sourcebytes.length - source.length (); for (int i = cible.length-numpadbytes; i <cible.length; i ++) cible [i] = '='; return new String (cible); } private static char [] getPaddedBytes (String Source) {char [] converti = source.tocharArray (); int requisLength = 3 * ((converti.length + 2) / 3); char [] result = new char [requiredLength]; System.ArrayCopy (converti, 0, résultat, 0, converti.length); Résultat de retour; } private static void convert3to4 (char [] source, int sourceIndex, char [] cible) {cible [0] = (char) (source [sourceIndex]> >> 2); Target [1] = (char) (((source [sourceIndex] & 0x03) <<4) | (source [sourceIndex + 1]>>> 4)); Target [2] = (char) (((source [sourceIndex + 1] & 0x0f) <<2) | (source [sourceIndex + 2]>>> 6)); cible [3] = (char) (source [sourceIndex + 2] & 0x3f); } / ** * Renvoie l'équivalent en texte en clair d'une chaîne de base à 64. * @param source une chaîne de base 64 (qui doit avoir un multiple de 4 caractères) * / public static static Decode (String Source) {if (source.length ()% 4! = 0) Jetez une nouvelle RuntimeException ("les codes de base64 valides ont un multiple de 4 caractères"); int numgroups = source.length () / 4; int numextrabytes = source.endswith ("==")? 2: (source.endswith ("=")? 1: 0); octet [] TargetBytes = nouveau octet [3 * numgroups]; octet [] SourceBytes = nouveau octet [4]; pour (int groupe = 0; groupe <numgroups; groupe ++) {pour (int i = 0; i <sourceBytes.Length; i ++) {SourceBytes [i] = (byte) math.max (0, EncodingChar.Indexof (Source.Charat (4 * Group + I))); } convert4to3 (SourceBytes, TargetBytes, groupe * 3); } return new String (TargetBytes, 0, TargetBytes.Length - Numextrabytes); } private static void convert4to3 (byte [] source, byte [] cible, int targetIndex) {cible [cibleIndex] = (byte) ((source [0] <2) | (source [1]>>> 4)); Target [TargetIndex + 1] = (byte) (((source [1] & 0x0f) <<4) | (source [2]>>> 2)); Target [TargetIndex + 2] = (byte) (((source [2] & 0x03) <<6) | (source [3])); }}