![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| null56 |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
Всем привет
Разбираюсь с base64, понял его суть и принцип работы, но не могу понять, ЧТО, а главное КАК автор использует для своих целей словарь Вот пример (не мой, со ссылок википедии) Исходный словарь, для кодирования байтов
И вот что - то зверское, созданное автором для каких целей, я так и не понял
Вот его код использования
функция decodeblock, уже формирует из 4 байтов 3, там всё понятно, но вот что происходит
Вопрос: что за хитрый алгоритм использует автор алгоритма и как надо формировать этот интересный массив cd64, если допустим я захочу (а мне и надо) изменить пару символов в исходном словаре Заранее благодарен за помощь Добавлено через 10 минут и 3 секунды вообще мысли у меня уже в кучу, но подозрение на то, что загадочный массив cd64 - это массив кодов значений, которые были получены из 6 битовых значений входных байтов, при енкодинге Это сообщение отредактировал(а) null56 - 4.3.2010, 00:35 |
||||||||
|
|||||||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
проще написать самому с нуля
|
|||
|
||||
| null56 |
|
||||||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
Разобрался я в алгоритме автора по ходу реализации своего
Еще раз, в чем суть алгоритма base64 Encoding: 1) Вытащить 3 байта и сделать из них 4, посредством вытаскивания 6 битов... всё верно 3 байта * 8 = 24 бита, а 24 / 6 = 4 (6 битовых значения) 2) Использовать полученные 6 битовые значения, как индексы в алфавите ниже, значения могут быть [0..63]
Возьмем последовательсность: 65, 66, 67 (A,B,C). - двоичное представление: 01000001 (65), 01000010 (66), 01000011 (67) - вытащим 4 шестибитовых значений: 010000 (16), 010100 (20), 001001 (9), 000011(3) - используем эти шестибитовые значения в качестве индексов в алфавите: Q(16), U(20), J(9), D(3) - это выходная последовательность, то есть выходной base64 - но ведь в выходной последовательсности у нас уже не 16, 20, 9, 3, а коды цифр алвавита: 81(Q), 85(U), 74(J), 68(D), то есть просто так мы не вернемся, нам нужна таблица соответсвий реальных индексов, которая была на шаге раньше, где: ['А'] - 0 ['B'] - 1 ....... ['+'] - 62 ['/'] - 63 в кодовом представлении это будет выглядеть так [65] - 0 [66] - 1 [67] - 2 ............ [43] - 62 [47] - 63 реализация
Если сделать вывод полученной последовательности, то имеем (я сделал вывод в три строки, для наглядности), знаком $ помечены символы, которые не входят в алфавит base64
обратив внимание на вторую строку и сравнив ее с созданной автором
я обнаружил сходство, начиная с символа 43... По русски, автор просто не стал использовать все 255 символов, а отбросил всё до 43 и после 122... действительно, зачем они? и таблица у него смещена на 43 символа, это объясняет
Далее меня интересовало, зачем автор сделал все символы на 61 кодовое значение меньше.... тут я думаю просто, чтобы их можно было представить в виде строки
Ну и наконец погрешность индекса
Так что вот такие дела ) |
||||||||||||||||
|
|||||||||||||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |