임의의 길이의 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
, 우리는 우리가 시작 동일한 값으로 디코딩하는 데 실패했습니다.
샘플 입력 및 예상 출력을 제공하십시오. 게시물에 작성한 코드만으로는 설명이 충분하지 않습니다. – texasbruce
그냥 뭐가 잘못 됐어 : string.to_i (16)? – pguardiario
string.to_ (16)은 임의의 비트 열이 아닌 16 진수 문자열을 변환합니다. – punund