Base64 является одним из наиболее распространенных методов кодирования в сети для передачи 8 -битного байтового кода. Вы можете проверить RFC2045 ~ RFC2049, который содержит подробные характеристики MIME. BASE64 требует преобразования каждых трех 8 -битных байтов в четыре 6 -битных байта (3*8 = 4*6 = 24), а затем добавление двух высоких от 0 до 6 бит с образованием четырех 8 -битных байтов. Другими словами, преобразованная строка теоретически будет на 1/3 длиннее исходной.
Функции PHP: base64_encode () и base64_decode ()
BASE64 Кодирование, принцип декодирования
BASE64 Кодирование фактически преобразует 3 8-битных байта в 4 6-битные байты (3*8 = 4*6 = 24). Эти 4 шестибитных байта на самом деле все еще 8-битные, но более высокие два бита устанавливаются на 0. Когда только 6 бит байта действительны, его стоимость пространство составляет от 0 до 2 минуса. (0 ~ 63).
На самом деле, в коде ASCII есть много невидимых символов между 0 и 63, поэтому следует сделать еще одно отображение, а таблица отображения
'A' ~ 'Z'? ASCII (0 ~ 25)
'a' ~ 'Z'? ASCII (26 ~ 51)
'0' ~ '9'? ASCII (52 ~ 61)
''? ASCII (62)
'/'? ASCII (63)
Это преобразует 3 8-битных байта в 4 видимых символа.
Конкретный метод расщепления байтовых: (рисунок (плохо, понимайте дух :-))
AAAAAABB CCCDDDD EEFFFFFF // ABCDEF на самом деле 1 или 0. Чтобы ясно видеть, вместо этого используйте ABCDEF
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Байт 1 байт 2 байта 3
||
//
00aaaaaaa 00bbcccc 00dddee 00ffffff
ПРИМЕЧАНИЕ. Вышеуказанные три байтовых бита являются исходным текстом, следующие четыре байта - кодирование Base64, а первые два бита - 0.
При расщеплении такого пути количество байтов в исходном тексте должно быть кратным 3. Когда это условие не может быть выполнено, используйте все нулевые байты
Дополнение при преобразовании кодирование BASE64 заменяется = знак, поэтому некоторые кодировки BASE64 заканчиваются одним или двумя равными знаками.
Причина пакета, но есть не более двух равных знаков, потому что: если F (Origin) представляет количество байтов в исходном тексте, F (остаться) используется для
остаток таблицы, тогда
F (остаться) = f (происхождение) мод 3 установлен.
Следовательно, возможные значения f (остаться) составляют 0, 1, 2.
Если n = [f (Origin) f (остаться)] / 3
Когда F (остается) = 0, он преобразуется в кодирование байтов 4*N байтов.
Когда f (остается) = 1, поскольку буквальный байт можно разделить на два байса, кодированных Base64, чтобы
Let Base64 Encode равен 4 раза 4, поэтому он должен быть дополнен 2 равными знаками.
Когда f (остаться) = 2, поскольку два исходных текстовых байта могут быть разделены на 3 базовых 64 байта, аналогично,
Следует добавить равный знак.
BASE64 Будет от 0 до 2 равных знаков в конце закодированной строки. Эти равные признаки не нужны для декодирования, поэтому их можно удалить.
Когда сеть получает и публикует списки параметров, перечислены, «+» не может быть передано нормально, поэтому вы можете заменить его на '|'
Таким образом, строки, кодируемые Base64, имеют только '|' и '/', поэтому строки, кодируемые BASE64, могут быть переданы в виде списков параметров со значениями параметров
==========================================================================================
Ниже приводится реализация, написанная иностранцами:
пакет com.meterware.httpunit;
/***************************************************
* $ Id: base64.java, v 1,4 2002/12/24 15:17:17 Russgold Exp $
*
* Copyright (C) 2000-2002
*
* НАСТОЯЩИЕ разрешение предоставляется бесплатно любому лицу, получающему копию этого программного обеспечения и связанного
* Файлы документации («Программное обеспечение»), чтобы иметь дело в программном обеспечении без ограничений, включая, помимо прочего,
* Права на использование, копирование, изменение, объединение, публикация, распространение, сублиценс и/или продавать копии программного обеспечения, и
* разрешить людям, которым предоставлено программное обеспечение, при условии следующих условий:
*
* Вышеуказанное уведомление об авторском праве и это уведомление о разрешении должно быть включено во все копии или существенные части
* программного обеспечения.
*
* Программное обеспечение предоставляется «как есть», без гарантии любого рода, явного или подразумеваемого, включая, помимо прочего, не ограничиваясь
* Гарантии товарной пригодности, пригодности для определенной цели и неинфекции. Ни в каком случае
* Авторы или владельцы авторских прав нести ответственность за любые претензии, ущерб или другую ответственность, будь то в действии
* Договор, деликт или иным образом, возникает из или в связи с программным обеспечением или использованием или другим
* Сделки в программном обеспечении.
*
***************************************************** •
/**
* Утилита для преобразования в кодирование базы 64.
*
* @author <a href = "mailto: [email protected]"> Рассел Голд </a>
**/
открытый класс Base64 {final Static String EncodingChar = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/"; /*** Возвращает базовый 64, кодированный эквивалент поставляемой строки. * @param source строка для кодирования */ public static String encode (String Source) {char [] sourcebytes = getPaddedBytes (source); int numgroups = (sourcebytes.length + 2) / 3; char [] targetbytes = new char [4]; char [] target = new char [4 * numgroups]; for (int Group = 0; Group <numGroups; Group ++) {convert3to4 (SourceBytes, Group*3, TargetBytes); for (int i = 0; i <targetbytes.length; i ++) {target [i+4*group] = encodingchar.charat (targetbytes [i]); }} int numpadbytes = sourcebytes.length - source.length (); для (int i = target.length-numpadbytes; i <target.length; i ++) target [i] = '='; вернуть новую строку (Target); } private static char [] getPaddedBytes (String Source) {char [] Converted = source.thararray (); int redinglength = 3 * ((преобразовано. length+2) /3); char [] result = new char [обязательно длиной]; System.ArrayCopy (преобразовано, 0, результат, 0, преобразован. результат возврата; } private static void convert3to4 (char [] source, int sourceindex, char [] target) {target [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)); Target [3] = (char) (Source [SourceIndex+2] & 0x3f); } /*** Возвращает открытый текст эквивалент базовой 64-кодированной строки. * @param Source a Base 64 String (которая должна иметь кратные 4 символов) */ public Static String Decode (String Source) {if (source.length ()%4! = 0) бросить новое runtimeexception («Допустимые коды Base64 имеют кратные 4 символов»); int numgroups = source.length () / 4; int numextrabytes = source.endswith ("==")? 2: (source.endswith ("=")? 1: 0); byte [] targetbytes = new Byte [3*numgroups]; byte [] sourcebytes = new Byte [4]; for (int group = 0; group <numgroups; group ++) {for (int i = 0; i <sourcebytes.length; i ++) {sourcebytes [i] = (byte) math.max (0, encodingchar.indexof (source.charat (4*group+i)))); } convert4to3 (SourceBytes, TargetBytes, Group*3); } вернуть новую строку (TargetBytes, 0, targetBytes.length - numexTrabytes); } private static void convert4to3 (byte [] source, byte [] target, int targetindex) {target [targetindex] = (byte) ((source [0] <2) | (источник [1]>>> 4)); target [targetindex+1] = (byte) (((Source [1] & 0x0f) <<4) | (источник [2]>>>> 2)); Target [TargetIndex+2] = (byte) (((Source [2] & 0x03) <<6) | (Источник [3])); }}