Base64 é um dos métodos de codificação mais comuns na rede para transmitir código de bytes de 8 bits. Você pode verificar o RFC2045 ~ RFC2049, que contém especificações detalhadas do MIME. Base64 requer converter a cada três bytes de 8 bits em quatro bytes de 6 bits (3*8 = 4*6 = 24) e, em seguida, adicionar dois 0s a 6 bits para formar quatro bytes de 8 bits. Em outras palavras, a corda convertida teoricamente será 1/3 mais longa que a original.
Funções PHP: BASE64_ENCODE () e BASE64_DECODE ()
Base64 codificação, princípio de decodificação
A codificação base64 realmente converte 3 bytes de 8 bits em 4 bytes de 6 bits, (3*8 = 4*6 = 24) Esses 4 bytes de seis bits ainda são de 8 bits, mas os dois bits mais altos são definidos como 0. (0 ~ 63).
De fato, existem muitos caracteres invisíveis no código ASCII entre 0 e 63, então outro mapeamento deve ser feito, e a tabela de mapeamento é
'A' ~ 'z'? ASCII (0 ~ 25)
'a' ~ 'z'? ASCII (26 ~ 51)
'0' ~ '9'? ASCII (52 ~ 61)
''? ASCII (62)
'/'? ASCII (63)
Isso converterá 3 bytes de 8 bits em 4 caracteres visíveis.
O método específico de divisão de bytes é: (Figura (desenhada mal, entenda o espírito :-))
aaaaaabb cccdddd eeffffff // abcdef é na verdade 1 ou 0. Para ver claramente, use o abcdef em vez
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Byte 1 byte 2 byte 3
||
//
00aaaaaa 00bbcccc 00dddee 00fffffffffffffffffff
NOTA: Os três bits de bytes acima são texto original, os quatro bytes a seguir são a codificação Base64 e os dois primeiros bits são 0.
Ao se separar dessa maneira, o número de bytes no texto original deve ser um múltiplo de 3. Quando essa condição não puder ser atendida, use todos os zero bytes
Complemento, ao converter, a codificação Base64 é substituída por = sinal, e é por isso que algumas codificações Base64 são encerradas com um ou dois sinais iguais.
A razão para o pacote, mas há no máximo dois sinais iguais, porque: se f (origem) representa o número de bytes no texto original, f (restante) é usado para
Tabela restante, então
F (restante) = f (origem) Mod 3 é estabelecido.
Portanto, os possíveis valores de f (restante) são 0, 1, 2.
Se n = [f (origem) f (permanece) / 3
Quando f (permanece) = 0, ele é convertido em codificação de 4*n bytes base64.
Quando f (permanece) = 1, uma vez que um byte literal pode ser dividido em dois bytes codificados pela base64, a fim de
Seja Base64 Encode um múltiplo de 4, para que ele seja complementado com 2 sinais iguais.
Quando f (permanece) = 2, já que os dois bytes de texto originais podem ser divididos em 3 bytes codificados pela base64, da mesma forma, da mesma forma,
Um sinal igual deve ser adicionado.
BASE64 Haverá 0 a 2 sinais iguais no final da sequência codificada. Esses sinais iguais não são necessários para a decodificação, para que possam ser excluídos.
Quando a rede Get e Post Parameter Lists são listados, '+' não pode ser transmitido normalmente, para que você possa substituí -lo por '|'
Dessa forma, as cordas codificadas pela base64 têm apenas '|' e '/', para que as seqüências codificadas por Base64 podem ser transferidas como listas de parâmetros com valores de parâmetros
===================================================================================================
A seguir, é apresentada uma implementação escrita por estrangeiros:
pacote com.meterware.httpunit;
/***************************************
* $ Id: base64.java, v 1.4 2002/12/24 15:17:17 Russgold exp $
*
* Copyright (c) 2000-2002 por Russell Gold
*
* A permissão é concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e associada
* Arquivos de documentação (o "software"), para lidar com o software sem restrições, inclusive sem limitação
* Os direitos de usar, copiar, modificar, mesclar, publicar, distribuir, sublicensionar e/ou vender cópias do software e
* Permitir pessoas a quem o software é fornecido para fazê -lo, sujeito às seguintes condições:
*
* O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todas as cópias ou porções substanciais
* do software.
*
* O software é fornecido "como está", sem garantia de qualquer tipo, expresso ou implícito, incluindo, mas não limitado a
* As garantias de comercialização, aptidão para uma finalidade específica e não invasão. Em nenhum caso o
* Autores ou detentores de direitos autorais são responsáveis por qualquer reclamação, danos ou outro passivo, seja em uma ação de
* Contrato, delito ou não, decorrente de, fora ou em conexão com o software ou o uso ou outro
* Negociações no software.
*
*******************************************
/**
* Uma classe de utilidade para converter para e para a base 64 codificação.
*
* @Author <a href = "Mailto: [email protected]"> russell Gold </a>
**/
classe pública base64 {final static string codingchar = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/"; /*** Retorna a base 64 codificada equivalente a uma corda fornecida. * @param fonte a sequência para codificar */ public static string cody (string fonte) {char [] fonteBytes = getPaddedBytes (origem); int numGroups = (fonteBytes.Length + 2) / 3; char [] TargetBytes = novo char [4]; char [] Target = novo char [4 * numgroups]; for (int group = 0; grupo <numGroups; grupo ++) {convert3to4 (fonte de origem, grupo*3, TargetBytes); for (int i = 0; i <TargetBytes.Length; i ++) {Target [i+4*grupo] = codingchar.charat (TargetBytes [i]); }} int numpadbytes = fonteBytes.Length - fonte.Length (); for (int i = Target.Length-Numpadbytes; i <Target.Length; i ++) Target [i] = '='; return New String (Target); } private estático char [] getPaddedBytes (String fonte) {char [] convertido = fonte.toCharArray (); int requerirLength = 3 * ((convertido.length+2) /3); char [] resultado = novo char [requerirLength]; System.arraycopy (convertido, 0, resultado, 0, convertido.length); resultado de retorno; } Void estático privado convert3to4 (char [] fonte, Int SourceIndex, char [] Target) {Target [0] = (char) (fonte [SourceIndex] >>>> 2); Target [1] = (char) (((fonte [SourceIndEx] & 0x03) <<4) | (fonte [SourceIndex+1] >>>> 4)); Target [2] = (char) (((fonte [SourceIndex+1] & 0x0f) <<2) | (fonte [SourceIndex+2] >>>> 6)); Target [3] = (char) (fonte [SourceIndex+2] e 0x3f); } /*** Retorna o texto simples equivalente a uma string baseada em 64. * @param Fonte A Base 64 String (que deve ter um múltiplo de 4 caracteres) */ public static string decode (string fonte) {if (fonte.Length ()%4! = 0) lança a nova RuntimeException ("os códigos Base64 válidos têm um múltiplo de 4 caracteres"); int numgroups = fonte.length () / 4; int numexTrabytes = fonte.endswith ("==")? 2: (fonte.endswith ("=")? 1: 0); byte [] TargetBytes = novo byte [3*numgroups]; byte [] fonteBytes = novo byte [4]; para (int group = 0; grupo <numGroups; grupo ++) {for (int i = 0; i <fontebytes.length; i ++) {fontebytes [i] = (byte) math.max (0, codingchar.indexof (fonte.charat (4*group+i))); } Convert4to3 (SourceBytes, TargetBytes, Grupo*3); } Retorne new String (TargetBytes, 0, TargetBytes.Length - numExtrabytes); } private estático void convert4to3 (byte [] fonte, byte [] Target, int TargetIndex) {Target [TargetIndex] = (byte) ((fonte [0] <<2) | (fonte [1] >>>> 4)); Target [TargetIndex+1] = (byte) (((fonte [1] e 0x0f) <<4) | (Fonte [2] >>>> 2)); Target [TargetIndex+2] = (byte) (((fonte [2] e 0x03) <<6) | (fonte [3])); }}