将十六进制字符串转换为十六进制整数

19

我需要将一个十六进制字符串转换为十六进制整数,就像这样:

color = "0xFF00FF" #can be any color else, defined by functions
colorto = 0xFF00FF #copy of color, but from string to integer without changes

我也可以使用RGB格式。

我必须这样做,因为此函数在以下情况之后执行:

def i2s int, len
  i = 1
  out = "".force_encoding('binary')
  max = 127**(len-1)

  while i <= len
    num = int/max
    int -= num*max
    out << (num + 1)
    max /= 127
    i += 1
  end

  out
end

我在这里看到十六进制整数的存在。有人能帮我解决这个问题吗?


你为什么期望color.to_i不是0?你已经阅读了API文档(http://apidock.com/ruby/String/to_i),其中显示基数默认为“10”,因此带有零然后是‘x’的字符串将被视为十进制零。你需要告诉`to_i`方法,你的字符串是十六进制字符串,而API也有说明。 - Pavling
友情提示,十六进制整数并不存在。十六进制字符串“0xF”,十进制字符串“15”,八进制字符串“017”和二进制字符串“0b1111”都代表同一个整数。这就像“hello”、“Привет”和“你好”意思相同一样。 - Jefferson Hudson
3个回答

38

使用String#to_i方法需要提供整数基数参数:

irb> color = "0xFF00FF"
irb> color.to_i(16)
=> 16711935
irb> color.to_i(16).to_s(16)
=> "ff00ff"
irb> '%#X' % color.to_i(16)
=> "0XFF00FF"

1
@FrereDePute 什么?! color.to_i(16) == 0xff00ff # true - David Unric

14

首先,一个整数永远不可能是十六进制的。每个整数都有一个十六进制的表示,但那只是一个字符串。

要将包含以0x为前缀的整数十六进制表示的字符串转换为Ruby中的整数,请对其调用函数Integer

Integer("0x0000FF") # => 255

1
或者,Integer("0000FF", 16) - Hubro
1
点赞是因为这给了我解决特定问题所需的东西——一种解析字符串的方法,可以正确处理基数的标准表示方式,因此Integer("0x10"),Integer("010"),Integer("10"),甚至Integer("0b10")都会得到不同的答案(分别为16、8、10和2)。正是我想要的。谢谢! - lindes

11

2.1.0 :402 > "d83d".hex => 55357


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接