我的问题是如何将命令argv的stdin或从hex转换成ascii
我知道如果我把十六进制字符串赋给变量,一旦我打印出来它就会被转换
前任
hex_var = "\x41\41\x41\41"
puts hex_var
结果会是
美国航空航天协会
但我需要通过(argv或gets)从命令行获取值
说我有这句台词
s = ARGV
puts s
# another idea
puts s[0].gsub('x' , '\x')
然后我跑了
ruby gett.rb \x41\x41\x41\x41
我得到了
\ X41\X41\X41\X41
有办法让它工作吗?
最佳答案
你在这里要处理几个问题。你已经试着解决了第一个问题,但我认为你的解决方案并不理想。与命令行参数一起传递的反斜杠是由shell计算的,而不是生成到ruby脚本。如果你只想在脚本中做一个gsub,甚至没有理由把它们传递进来。这样做意味着参数中的任何“x”都将被交换掉,即使那些不是用来表示十六进制的。如果可能的话,最好对参数中的\进行双重转义。如果没有价值观来自何方的背景,很难说实际情况会更好。
ruby gett.rb \\x41\\x41
这样,argv实际上会得到“\x41\x41”,这更接近您想要的。
但这仍然不是您想要的,因为argv参数是在没有表达式替换的情况下创建的(就像它们是单引号一样)。所以Ruby正在逃避这个问题,即使你不想这样做。从本质上说,你需要重新评估它,就像它是在双引号。
eval('"%s"' % s)
S是绳子。
总而言之,你可能会得到以下两种结果:
# ruby gett.rb \x41\x41
ARGV.each do |s|
s = s.gsub('x' , '\x')
p eval('"%s"' % s)
end
# => "AA"
# ruby gett.rb \\x41\\x41
ARGV.each do |s|
p eval('"%s"' % s)
end
# => "AA"