конвертировать рубиновый String в Bignum - PullRequest
3 голосов
/ 22 марта 2012

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

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 22 марта 2012

База по умолчанию для 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
5 голосов
/ 09 июля 2013

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

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

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