2014-10-12 2 views
0

이것은 루비에만 국한된 문제보다 더 일반적인 문제입니다. 루비에서 발생하고 있습니다. 문자열을 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" 

나는 명백한 누락 될 수 있습니다.

예외없이 양방향으로 변환하려면 어떻게해야합니까?

+0

무엇이 당신의 질문입니까? – sawa

+0

죄송합니다. 명확하지 않은 경우 예외없이 양방향으로 변환 할 수 있기를 바랍니다. – brancz

+0

선행 0은 삭제됩니다. ' "0123".to_i.to_s'는 "123"을 반환합니다. – Stefan

답변

1

이 문제는 좀 더 일반적인 문제입니다.

"패딩"을 사용하면 누락 비트 표시 또는 완전히 완벽하지 않은 변환과 같은 추가 정보가 채워집니다.

예를 들어 특정 코드에서 첫 번째 프리미티브 인 경우 현재 주인공을 잃고 있습니다. 이는 선행 문자에 인덱스가 없기 때문에 int에 0을 더하고 있기 때문에 아무 것도 변경되지 않습니다.

코드에서 패딩은 다양한 방법으로 수행 할 수 있습니다.

예를 들어 첫 번째 프리미티브가 아닌 주어진 선행 문자를 앞에 붙입니다.

기본적으로 0 값을 보호 할 방법을 선택해야하므로 int에 의해 손실되지 않습니다.

대체 솔루션은 int를 사용하지 못하도록 문자열을 바꾸는 것입니다. 일반적인 Base64 인코딩 클래스가이를 수행합니다. 입력은 문자열이고 저장소는 문자열입니다.

+0

지금까지 내가했던 것처럼 처음 UTF-8 문자를 인쇄 할 수없는 문자 인 charset의 첫 번째 문자로 삽입합니다. 모든 입력은 키보드에서 가져온 것이므로 작동하는 절충안입니다. – brancz