将ruby String转换为Bignum

时间:2012-03-22 00:24:22

标签: ruby bignum

我有一个二进制字符串,比如说

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

(实际上更长)。我需要将它表示为Bignum,以便进一步转换为基本序列(某些> 36)。

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

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

无需使用unpack并通过中间十六进制字符串表示。

要将二进制字符串直接转换为数字(根据需要自动成为Bignum),您可以执行以下操作:

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