#javascript #url #encoding #base32
#javascript #url #кодирование #base32
Вопрос:
Я хотел бы написать некоторые идентификаторы для использования в URL-адресах в Crockford base32. Я использую модуль npm base32.
Так, например, если пользователь вводит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
Хорошо, так, может быть, мне нужно использовать decode?
var encoded1 = base32.decode('4a2a');
var encoded2 = base32.decode('4A2A');
console.log(encoded1, encoded2);
Нет, это просто дает мне пустые строки:
" "
Что я делаю не так, и как я могу заставить 4A2A и 4A2A сопоставляться с одним и тем же?
Комментарии:
1. Что произойдет, если вы попытаетесь использовать decode на
6hgk4r8
? Это работает? Вы уверены,4a2a
что для этой библиотеки допустима кодировка base-32?2. Да, это действительно работает. Я думаю, возможно, вы правы и
4a2a
это недопустимая кодировка base-32… но почему бы и нет?3. Ну, когда я запускаю его здесь, 4a2a фактически возвращает выходные данные, кавычки и управляющий символ 0x84. Итак, я не уверен, откуда вы взяли 4a2a, но если он должен был возвращать текст (в отличие от числа), он использует другую базу-32.
Ответ №1:
Для входящего запроса вам потребуется декодировать фрагмент 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
, в то время как кодировка Crockford исключает I, L, O, U
. Это было бы проблемой, если бы вы пытались взаимодействовать с другой системой, которая использовала другую библиотеку. Если никому, кроме вас, никогда не понадобится декодировать фрагменты вашего URL, то совместимость не имеет значения.
Ответ №2:
Источник вашей путаницы заключается в том, что base64 или base32 являются методами представления чисел, тогда как вы пытаетесь в своих примерах кодировать или декодировать текстовые строки.
Кодирование и декодирование текстовых строк как base32 выполняется путем первого преобразования строки в большое число. В ваших первых примерах, где вы кодируете «4a2a» и «4A2A», это строки с двумя разными числовыми значениями, которые, следовательно, преобразуются в кодированные числа base32 с двумя разными значениями, 6hgk4r8 6h0k4g8
когда вы «декодируете» 4a2a и 4A2A, вы говорите, что получаете пустые строки. Однако это неверно, строки не являются пустыми, они содержат то, как выглядит декодированное число, когда интерпретируется как строка. То есть это выглядит как ничто, потому что 4a2a выдает непечатаемый символ. Это невидимо. Что вы хотите, так это указать номера кодировщика, а не строки.
Ответ №3:
JavaScript имеет
parseInt(число, 32)
и
num.toString(32)
встроен таким образом, что совместим с Java и всеми версиями JavaScript.