2012-04-15 2 views
2

임의의 길이의 2 진 문자열을 숫자로 표현할 필요가 있습니다. 이 겉보기에 사소한 작업은 예기치 않게 복잡 해졌다. 내가 지금까지 가지고 올 수있는 최선루비 : Bignum으로 이진 문자열 표현하기

string.unpack('H*')[0].to_i(16) 

하지만, 압축을 풀고 가장 높은 니블 앞에 0이 반환 할 수 있기 때문에이 작업은 가역성이 부족 : 내가 가진 경우

['ABC'].pack('H*') == ['0ABC'].pack('H*') # false 

지금 내가 확인해야을 정수에서 변환 한 후 짝수 개의 니블을 필요에 따라 0으로 채 웁니다. 모든 것이 분명하고 명확하지만이 코드가 너무 복잡해야합니다. 예와

업데이트 :

s = "\x01\x1D\x9A".force_encoding 'binary' # "\x01\x1D\x9A" 
s.unpack('H*') # ["011d9a"] 
s.unpack('H*')[0].to_i(16) # 73114 

지금하자 디코드 : 즉

s.unpack('H*')[0].to_i(16).to_s(16) # "11d9a" — notice that leading zero is gone 
[s.unpack('H*')[0].to_i(16).to_s(16)].pack('H*') # "\x11\xD9\xA0" 
[s.unpack('H*')[0].to_i(16).to_s(16)].pack('H*') == s # false, obviously 

, 우리는 우리가 시작 동일한 값으로 디코딩하는 데 실패했습니다.

+0

샘플 입력 및 예상 출력을 제공하십시오. 게시물에 작성한 코드만으로는 설명이 충분하지 않습니다. – texasbruce

+0

그냥 뭐가 잘못 됐어 : string.to_i (16)? – pguardiario

+0

string.to_ (16)은 임의의 비트 열이 아닌 16 진수 문자열을 변환합니다. – punund

답변

0

불행하게도, 내가 루비 제로 지식을 가지고,하지만 당신이 확인할 수있는 아이디어 ...

.to_s 수 있음 (16) 방법은 다른 기본 인코딩이 될 수있다이 때 중요한 문자열로 변환이 .pack ('H *') 뒤에 문자열 비교를합니까? force_encoding 'binary'== s

force_encoding 'binary'== s [s.unpack ('H *') [0] .to_i (16) .to_s (16)].

그렇지 않으면 선행 0을 갖는 니블이 동일한 문자열 바이트와 다른 문자열 바이트로 변환 될 수 있지만 0이 아닌 16 진수 니블로 변환되는 것을 상상하는 것은 어렵습니다.