我有一个二进制字符串,说转换红宝石字符串BIGNUM
x = "c1\x98\xCCf3\x1C\x00.\x01\xC7\x00\xC0"
(实际上是更长的时间)。我需要将它表示为Bignum,以便进一步转换为基本序列(大于36)。
x.unpack('H*')[0].to_i
从该值的第一个字节产生一个整数,而不是一个Bignum。
我有一个二进制字符串,说转换红宝石字符串BIGNUM
x = "c1\x98\xCCf3\x1C\x00.\x01\xC7\x00\xC0"
(实际上是更长的时间)。我需要将它表示为Bignum,以便进一步转换为基本序列(大于36)。
x.unpack('H*')[0].to_i
从该值的第一个字节产生一个整数,而不是一个Bignum。
有没有必要使用unpack
,并经过一个中间的十六进制字符串表示。
要一个二进制串直接转换为数字(其将自动成为Bignum的根据需要),可以这样做:
"\xc1\x98\xCC\xf3\x1C\x00".bytes.inject {|a, b| (a << 8) + b }
=> 212862017674240
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
在Ruby,类型整数涵盖Fixnums和大数。你为什么说这不是一个Bignum?当我说'x.unpack('H *')[0] .to_i.class'时,我得到'Bignum',其中'x'非常大。 – 2012-03-22 00:33:16
@射线:你必须很幸运,并没有击中任何非十进制数字,直到你得到足够远的一个Bignum。 – 2012-03-22 02:53:56