簡體   English   中英

將值轉換為ASCII字符串的Ruby方法是什么?

[英]What is the Ruby way to convert a value to an ASCII string?

將數字轉換為ASCII字符串的最簡潔的Ruby方法是什么?

例如, a = 0x68656c6c6fa = "hello"

在沒有庫的普通C中,我會使用一個0xFF掩碼,我一直在移動。 不知怎的,我覺得Ruby有更短/更不明確的方式來做到這一點。

我正在使用Ruby 1.8.7。

["%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 }
["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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM