Преобразование строки в целое число без первого символа набора символов
Это скорее общая проблема, чем специфическая для ruby, я просто делаю это в ruby. Я пытаюсь преобразовать строку в Integer / Long / Bigint или как вы хотите ее назвать, используя набор символов, например Base62 (0-9a-zA-Z).
Проблема в том, что когда я пытаюсь преобразовать строку типа "0ab" в целое число, и это целое число обратно в строку, я получаю "ab". Это происходит с любой строкой, начинающейся с первого символа алфавита.
Вот пример реализации, которая имеет ту же проблему.
https://github.com/jtzemp/base62/blob/master/lib/base62.rb
В бою:
2.1.3 :001 > require 'base62'
=> true
2.1.3 :002 > Base62.decode "0ab"
=> 2269
2.1.3 :003 > Base62.encode 2269
=> "ab"
Я могу упустить очевидное.
Как я могу конвертировать двунаправленно без этого исключения?
1 ответ
Вы правы, что это более общая проблема.
Одним из решений является использование "заполнения", которое заполняет дополнительную информацию, такую как указание пропущенных битов, или преобразование, которое не совсем идеально.
Например, в вашем конкретном коде вы теряете ведущий символ, если это первый примитив. Это потому, что ведущий символ имеет нулевой индекс, а вы добавляете ноль к вашему int, что ничего не меняет.
В вашем коде заполнение может быть выполнено различными способами.
Например, добавление заданного ведущего символа, который не является первым примитивом.
По сути, вам нужно выбрать способ защиты нулевого значения, чтобы оно не терялось int.
Альтернативное решение - изменить ваше хранилище с использования int на любой другой объект, не теряющий начальные нули, например строку. Вот как это делает типичный класс кодирования Base64: входные данные являются строкой, а хранилище также является строкой.