我正在尝试转换4字节数组的解包值?这在Ruby中是否可行?
说我写了b1 = b.unpack("N")
,打印b1
的值为1
。但是当我尝试使用.to_i控制台将b1转换为某个整数时,会为[118]抛出错误test.rb:13: undefined method
to_i':Array(NoMethodError)`
我的代码如下:
File.open('testfile','rb') do |file|
file.read.scan(/(.{4})(.{4})(.{4})(.*\w)(.{8})/).each do |a,b,c,d,e|
if a == "cook"
puts "test1"
else
puts "test2"
end
puts "output1"
b1 = b.unpack("N")
puts "output2"
c1 = c.unpack("N")
puts "output3"
puts "output4"
puts "output5"
end
end
答案 0 :(得分:1)
String#unpack
总是返回一个数组,即使只有一个值:
irb:01> s = "\x0\x0\x0*"
#=> "\u0000\u0000\u0000*"
irb:02> v = s.unpack('N')
#=> [42]
irb:03> v.class
#=> Array
您感到困惑,因为当您puts
数组时,它会在自己的行上输出每个值的to_s
版本;在这种情况下,看起来就像一个数字:
irb:04> puts v
#=> 42
irb:05> puts [1,2,3]
#=> 1
#=> 2
#=> 3
将来,在通过打印语句调试程序时,请使用p
而不是puts
,因为它的输出类似于源代码并且设计得很清楚:
irb:12> puts 42, "42", [42]
#=> 42
#=> 42
#=> 42
irb:13> p 42, "42", [42]
#=> 42
#=> "42"
#=> [42]
正如@Dave评论的那样,您需要从数组中提取整数以将其真正用作整数:
irb:06> i = v.first # or v[0]
#=> 42
irb:07> i.class
#=> Fixnum