将值转换为ASCII字符串的Ruby方法是什么?

时间:2012-01-23 14:35:31

标签: ruby string

将数字转换为ASCII字符串的最简洁的Ruby方法是什么?

例如,a = 0x68656c6c6f应该变为a = "hello"

在没有库的普通C中,我会使用一个0xFF掩码,我一直在移动。不知怎的,我觉得Ruby有更短/更不明确的方法来做到这一点。

我正在使用Ruby 1.8.7。

5 个答案:

答案 0 :(得分:6)

["%x" % 0x68656c6c6f].pack("H*")

更新:另一个疯狂的想法,在您的情况下可能有点过分,但这个想法适用于前导零。实际上它只是移位,但可以与mapinjecteach等各种函数一起使用。

class S
  include Enumerable

  def initialize(i)
    @i = i
  end

  def each(&block)
    while @i > 0
      @i, b = @i.divmod(256)
      block[b.chr]
    end
  end
end

S.new(0x0168656c6c6f).inject{ |a, c| c + a }

答案 1 :(得分:5)

["68656c6c6f"].pack("H*") #=> "hello"

查看Array的文档,特别是pack和unpack方法。

答案 2 :(得分:3)

我认为为您描述的问题编写类似C的代码没有任何问题。您正在处理低级处理,因此使用低级语法是可以接受的:

n = 0x68656c6c6f
s = ''
while n > 0
  p = n & 0xff
  n = n >> 8
  s = p.chr + s
end
puts s

必须有办法让代码感觉更像Ruby,但是,对于这个问题,我认为这是一个很好的选择。如果您在数组中使用了字符序列,则会更容易:

puts [0x68, 0x65, 0x6c, 0x6c, 0x6f].map{|n| n.chr}.reduce(:+)

答案 3 :(得分:1)

a = "0x68656c6c6f"
a = a[2..-1] # get rid of the 0x
a.scan(/../).each { |s| puts s.hex.chr }
H
e
l
l
o

答案 4 :(得分:0)

试试这个

"0x68656c6c6f"[2..-1].gsub(/../) { |val| val.hex.chr } => "hello"