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