Я пытаюсь закодировать строку Hi
в Base62 вручную. Мой процесс заключается в следующем:
Преобразуйте каждый символ «кошки» в соответствующее значение ascii:
H -> 99 -> 01001000
i -> 105 -> 01101001
реорганизован в 6-битные сегменты:
010010 000110 1001
x для заполнения:
010010 000110 1001xx
Обратитесь к индексной таблице Base62 для преобразования в Base62:
010010 -> I
000110 -> 6
1001xx -> a
xxxxxx -> 0
Это дает мне I6a0
, но я знаю, что это неправильно, потому что онлайн-кодировщики вместо этого дадут мне 4oz
. Что я здесь делаю не так? Каков правильный способ сделать это?
Механическое разделение битовой строки на шестибитные фрагменты является правильным для base64, поскольку оно эквивалентно делению на 64; но вам нужно разделить на 62.
Другими словами, что произойдет, если шесть бит будут равны 111111? Вы не смогли бы справиться с этим своей логикой, потому что на выбор есть только 62 символа, и все же для этого понадобится 64-й символ.
Другими словами, последовательность байтов можно интерпретировать как большое целое число (хотя и не такое уж большое в вашем случае, когда входных байтов всего два). Начиная с n=2 (так как все число меньше 623), разделите его на 62n; целочисленное частное дает первую цифру (вы можете посмотреть ее в таблице Википедии, на которую вы уже дали ссылку) и повторяете с остатком с n-=1, как любое преобразование по основанию x (где x = 62 в этом случае) до тех пор, пока вы не достигнете n=0.
В следующем вычислении используется простое целочисленное деление, которое вы, вероятно, выучили в школе до того, как узнали о дробях. Например, 11/4 даст целочисленный результат 2 и остаток 3 (поскольку 11 - 4*2 = 3), а не дробный результат 2,75.
Ваш ввод, преобразованный в одно целое число, равен 18537 (шестнадцатеричное 0x4869).
Разделив это на 3844 (622), получим 4, в остатке останется 3161.
(4
, что удобно, также является символом 4 в системе счисления 62.)
3161 разделить на 62 — 50, в остатке останется 61; символ 50 в таблице — o
, а символ 61 — z
.