将ruby String转换为Bignum

问题描述 投票:3回答:2

我说有一个二进制字符串

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

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

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

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

ruby bignum
2个回答
5
投票

没有必要使用unpack并通过中间十六进制字符串表示。

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

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

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
© www.soinside.com 2019 - 2024. All rights reserved.