我说有一个二进制字符串
x = "c1\x98\xCCf3\x1C\x00.\x01\xC7\x00\xC0"
(实际上更长)。我需要将它表示为Bignum,以便进一步转换为基本序列(某些事物> 36)。
x.unpack('H*')[0].to_i
从值的第一个字节产生一个Integer,而不是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