显示 ruby 命令的输出 .pack("H*")

Displaying the output of the ruby command .pack("H*")

我有一个 Rails 项目需要处理十六进制字符串。在某些阶段,我想打印我的字符串以进行故障排除和测试。但是我的输出中出现了奇怪的字符串。对于以下示例,我使用 Rails 3.1.3 和 ruby 1.9.3p385。

Rails 控制台:

["A"].pack('H*')
=> "\xA0"
["0A"].pack('H*')
=> "\n"
["54"].pack('H*')
=> "T"

运行相同的命令,但这次使用 puts 命令输出:

puts ["A"].pack('H*')
?
=> nil
puts ["0A"].pack('H*')

=> nil
puts ["54"].pack('H*')
"T"
=> nil

当我尝试使用 puts 命令打印结果时,为什么 ["A"] 和 ["0A"] 显示的结果与只是运行命令而不打印它?为什么 ["54"] 可以正常工作?

更新

上面我说 puts ["0A"].pack('H*') 显示不正确,但事实并非如此。 ["0A"].pack('H*') returns 换行字节,因此当您运行 puts ["0A"].pack('H*') 时,它会以字符串格式正确显示换行字节,看似什么都没有,但实际上是正确的。

irb 使用 inspect 方法生成要显示的字符串,而 ["A"].pack('H*').inspect"\xA0"puts 对其参数调用 to_s 以将它们转换为字符串,String#to_s 没有做任何有用的事情(除非返回 self 有用)所以:

puts ["A"].pack('H*')

正在尝试打印字节 \xA0,它不代表任何可打印的内容,无论您的终端使用何种编码(这些天可能是 UTF-8,但也可能是 ISO-8859-1 或 Windows -CP-1252) 所以你得到标准的 "I don't know what this is" 问号。 puts["0A"].pack('H*')["54"].pack('H*') 一起工作很好,因为它们产生可打印的字符。