将十六进制打印到ASCII

时间:2012-11-25 00:39:28

标签: ruby string hex ascii

我有一个包含此

的字符串password
\x79\x6F\x75\x63\x61\x6E\x74\x68\x61\x78\x6D\x65

我想将它们打印为ASCII字符。我通过取十六进制字符并在它们前面添加\x来创建此字符串。 puts(password)不起作用。但是,当我做类似的事情时:

shellcode = "\x65\x61"
puts(shellcode)

它运作得很好。我做错了什么?

1 个答案:

答案 0 :(得分:4)

字符串在Ruby中是一个奇怪的野兽,它们的处理在Ruby 1.9中巧妙地改变了,这使问题复杂化。

如果您使用单引号创建该字符串并来自其他来源(例如数据库),那么如果您inspect,则会看到:

"\\x79\\x6F\\x75\\x63\\x61\\x6E\\x74\\x68\\x61\\x78\\x6D\\x65"

你可以用一点列表处理来处理它:

s.scan(/\\x(..)/).map{|a| a.first.to_i(16).chr}.join
# => "youcanthaxme" 

解释:

  1. 我们通过\\xscan(/\\x(..)/))后面的两个字符提取单个组件:[["79"], ["6F"], ["75"], ["63"], ["61"], ["6E"], ["74"], ["68"], ["61"], ["78"], ["6D"], ["65"]]

  2. 对于列表中的每个元素(map),我们将其转换为整数(a.first.to_int(16)):[121, 111, 117, 99, 97, 110, 116, 104, 97, 120, 109, 101]

  3. 然后我们找到与ascii值对应的ascii字符(chr):["y", "o", "u", "c", "a", "n", "t", "h", "a", "x", "m", "e"]

  4. 然后我们join将它们放在一起:"youcanthaxme"