显示 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*')
一起工作很好,因为它们产生可打印的字符。
我有一个 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*')
一起工作很好,因为它们产生可打印的字符。