2012-03-22 152 views
2

我有一个二进制字符串,说转换红宝石字符串BIGNUM

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

(实际上是更长的时间)。我需要将它表示为Bignum,以便进一步转换为基本序列(大于36)。

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

从该值的第一个字节产生一个整数,而不是一个Bignum。

+0

在Ruby,类型整数涵盖Fixnums和大数。你为什么说这不是一个Bignum?当我说'x.unpack('H *')[0] .to_i.class'时,我得到'Bignum',其中'x'非常大。 – 2012-03-22 00:33:16

+2

@射线:你必须很幸运,并没有击中任何非十进制数字,直到你得到足够远的一个Bignum。 – 2012-03-22 02:53:56

回答

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