2014-10-12 2 views
0

Это скорее общая проблема, чем конкретная рубин, я просто делаю это в рубине. Я пытаюсь преобразовать строку в Integer/Long/Bigint или все, что вы хотите назвать, используя charset, например 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" 

я, возможно, отсутствует очевидное.

Как я могу преобразовать двунаправленный текст без этого исключения?

+0

В чем вопрос? – sawa

+0

Извините, если это было непонятно, я хочу иметь возможность конвертировать двунаправленный текст без этого исключения. – brancz

+0

Ведущие нули отбрасываются, например. '"".to_i.to_s' возвращает' "123" ' – Stefan

ответ

1

Вы правы, что это более общая проблема.

Одним из решений является использование «отступов», которое заполняет дополнительную информацию, такую ​​как указание отсутствующих битов, или преобразование, которое не совсем чистое.

В вашем конкретном коде, например, вы теряете главный символ, если это первый примитив. Это связано с тем, что ведущий символ имеет нулевой индекс, и вы добавляете нуль в свой int, что ничего не меняет.

В вашем коде прокладка может быть выполнена различными способами.

Например, добавление данного ведущего символа, который не является первым примитивом.

По существу, вам нужно выбрать способ защиты нулевого значения, чтобы он не терялся в int.

Альтернативное решение заключается в том, чтобы изменить хранилище с помощью int на использование любого другого объекта, который не теряет ведущие нули, такие как строка. Вот как это делает обычный класс кодировки Base64: вход представляет собой строку, а хранилище также является строкой.

+0

Как я это сделал, вставляет первый символ UTF-8 в качестве первого символа в кодировке, который является непечатаемым символом. Поскольку все мои входы с клавиатуры, это рабочий компромисс. – brancz

Смежные вопросы