Используете базу 32 Крокфорда для идентификаторов в URL? - PullRequest
1 голос
/ 04 ноября 2011

Я хотел бы написать несколько идентификаторов для использования в URL в base32 Крокфорда. Я использую модуль base32 npm .

Так, например, если пользователь вводит http://domain/page/4A2A, я бы хотел, чтобы он отображался на тот же базовый идентификатор, что и http://domain/page/4a2a

Это потому, что мне нужны удобные для пользователя URL-адреса, когда пользователю не нужно беспокоиться о разнице между заглавными и строчными буквами или между «l» и «1» - они просто получают страницу, которую они ожидать.

Но я изо всех сил пытаюсь реализовать это, в основном потому, что я слишком слаб, чтобы понять, как работает кодирование. Сначала я попробовал:

var encoded1 = base32.encode('4a2a');
var encoded2 = base32.encode('4A2A');
console.log(encoded1, encoded2);

Но они отображаются на разные базовые идентификаторы:

6hgk4r8 6h0k4g8

ОК, может мне нужно использовать декодирование?

var encoded1 = base32.decode('4a2a');
var encoded2 = base32.decode('4A2A');
console.log(encoded1, encoded2);

Нет, это просто дает мне пустые строки:

"    " 

Что я делаю не так, и как я могу получить 4A2A и 4A2A для сопоставления одному и тому же?

Ответы [ 3 ]

3 голосов
/ 03 декабря 2013

Для входящего запроса вам нужно декодировать фрагмент URL. Когда вы создаете URL, вы берете свой идентификатор и кодируете его. Таким образом, учитывая URL http://domain/page/dnwnyub46m50, вы возьмете этот фрагмент и расшифруете его. Пример:

#> echo 'dnwnyub46m50'| base32 -d

my_id5

Библиотека, на которую вы ссылаетесь, нечувствительна к регистру, поэтому вы получите тот же результат следующим образом:

echo 'DNWNYUB46M50'| base32 -d

my_id5

При работе с любой схемой кодирования (Base-16/32/64) у вас есть две основные операции: encode, которая работает с необработанным потоком битов / байтов, и decode, которая принимает кодированный набор байт и возвращает исходный бит / поток байтов. Страница Википедии о кодировке Base32 - отличный ресурс.

Когда вы декодируете строку, вы получаете необработанные байты: возможно, эти байты несовместимы с ASCII, UTF-8 или какой-либо другой кодировкой, с которой вы пытаетесь работать. Вот почему ваши декодированные примеры выглядят как пробелы: используемые вами инструменты не распознают полученные байты как допустимые символы.

Способ кодирования идентификаторов зависит от того, как генерируются ваши идентификаторы. Вы не сказали, как генерировали базовые идентификаторы, поэтому я не могу делать предположений ни о том, как вы должны обрабатывать необработанные байты, которые выходят из декодера, ни о содержимом необработанных байтов, передаваемых в кодировщик.

Также важно упомянуть, что библиотека, с которой вы связаны, несовместима с кодировкой Crockford Base32. Библиотека исключает I, L, O, S, а кодировка Крокфорда исключает I, L, O, U. Это будет проблемой, если вы пытаетесь взаимодействовать с другой системой, которая использует другую библиотеку. Если никому, кроме вас, никогда не понадобится декодировать фрагменты URL-адресов, совместимость не имеет значения.

0 голосов
/ 05 сентября 2013

JavaScript имеет

parseInt (num, 32)

и

num.toString (32)

встроен таким образом, чтобы он был совместим с Java и версиями JavaScript.

0 голосов
/ 09 ноября 2012

Источник вашей путаницы заключается в том, что base64 или base32 являются методами представления чисел, тогда как в ваших примерах вы пытаетесь кодировать или декодировать текстовые строки.

Кодирование и декодирование текстовых строк как base32 выполняетсясначала преобразовав строку в большое число.В ваших первых примерах, где вы кодируете «4a2a» и «4A2A», это строки с двумя разными числовыми значениями, которые, следовательно, преобразуются в кодированные числа base32 с двумя разными значениями: 6hgk4r8 6h0k4g8

при декодировании«4a2a и 4A2A вы говорите, что получаете пустые строки.Однако это не так, строки не пусты, они содержат то, на что похоже декодированное число, когда интерпретируются как строка.То есть это выглядит как ничто, потому что 4a2a производит непечатный символ.Это невидимоТо, что вы хотите, это кормить номера кодера, а не строки.

...