2012-03-22 3 views
2

У меня есть двоичная строка, скажетконвертировать рубин Строка Bignum

x = "c1\x98\xCCf3\x1C\x00.\x01\xC7\x00\xC0" 

(на самом деле гораздо больше). Мне нужно, чтобы он представлялся как Bignum, для дальнейшего преобразования в последовательности base-something (что-то> 36).

x.unpack('H*')[0].to_i 

дает целое число из первых байтов значения, а не Bignum.

+0

В Ruby, тип Integer охватывает Fixnums и Bignums. Почему вы говорите, что это не Bignum? Я получаю 'Bignum', когда я говорю' x.unpack ('H *') [0] .to_i.class', где 'x' очень велико. –

+2

@Ray: Вам должно быть повезло и не ударять по десятичным разрядам, пока вы не достигнете достаточно большого расстояния для Bignum. –

ответ

5

Там нет необходимости использовать unpack и пройти через промежуточный шестигранный строковое представление.

Чтобы преобразовать двоичную строку непосредственно в ряд (который будет автоматически являться Bignum по мере необходимости), вы можете сделать:

"\xc1\x98\xCC\xf3\x1C\x00".bytes.inject {|a, b| (a << 8) + b } 
=> 212862017674240 
5

База по умолчанию для String#to_i, конечно же, 10, но вы пытаетесь преобразовать гекс, чтобы вы хотели .to_i(16). Если вы не укажете базу, то to_i остановится, когда увидит первое не десятичное значение, и именно здесь происходит ваше усечение.

Вы хотите сказать:

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

Например:

>> "633198cc66331c0001c700c0633198cc66331c0001c700c063312e98cc66331c0001c700c0".to_i 
=> 633198 
>> "633198cc66331c0001c700c0633198cc66331c0001c700c063312e98cc66331c0001c700c0".to_i(16) 
=> 49331350698902676183344474146684368690988113012187221237314170009285390086987127695278272 
Смежные вопросы