ruby - 将十六进制打印为 ASCII

标签 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)

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

最佳答案

字符串在 Ruby 中是一种奇怪的野兽,在 Ruby 1.9 中对它们的处理发生了微妙的变化,这使事情变得有些复杂。

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

"\\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. 我们通过提取 \\x 后面的两个字符来提取各个组件 (scan(/\\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 值 (chr) 对应的 ascii 字符:["y", "o", "u", "c", "a", "n", "t", "h", "a", "x", "m", "e"]

  4. 然后我们将它们加入:"youcanthaxme"

关于ruby - 将十六进制打印为 ASCII,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13547193/

相关文章:

ruby - Redis:我应该将 IP 转换为整数吗?

arrays - 将数组值映射到具有递增键名的散列

Python 对字符串进行哈希处理

c - 用C语言制作计算器

java - 将字符串 aaaabbbbddd 转换为 a4b4d3

java - 解码十六进制字符串

java - JSpinner:显示一系列带符号的 HexBinary 值

ruby-on-rails - rails : display unique records in each loop

ruby-on-rails - Puma 或 Unicorn VS Webbrick 负载测试基准显示没有改善

c# - 按位运算符让我见鬼去吧