[英]What is the Ruby way to convert a value to an ASCII string?
將數字轉換為ASCII字符串的最簡潔的Ruby方法是什么?
例如, a = 0x68656c6c6f
為a = "hello"
。
在沒有庫的普通C中,我會使用一個0xFF掩碼,我一直在移動。 不知怎的,我覺得Ruby有更短/更不明確的方式來做到這一點。
我正在使用Ruby 1.8.7。
["%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 }
["68656c6c6f"].pack("H*") #=> "hello"
看看Array的文檔,特別是pack和unpack方法。
我認為為您描述的問題編寫類似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(:+)
a = "0x68656c6c6f"
a = a[2..-1] # get rid of the 0x
a.scan(/../).each { |s| puts s.hex.chr }
H
e
l
l
o
嘗試這個
"0x68656c6c6f"[2..-1].gsub(/../) { |val| val.hex.chr } => "hello"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.