将数字转换为ASCII字符串的最简洁的Ruby方法是什么?
例如,a = 0x68656c6c6f
应该变为a = "hello"
。
在没有库的普通C中,我会使用一个0xFF掩码,我一直在移动。不知怎的,我觉得Ruby有更短/更不明确的方法来做到这一点。
我正在使用Ruby 1.8.7。
答案 0 :(得分:6)
["%x" % 0x68656c6c6f].pack("H*")
更新:另一个疯狂的想法,在您的情况下可能有点过分,但这个想法适用于前导零。实际上它只是移位,但可以与map
,inject
,each
等各种函数一起使用。
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"