如何使用Ruby将解压缩的数组转换为单值?

时间:2012-04-02 10:45:42

标签: ruby arrays unpack

我正在尝试转换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

1 个答案:

答案 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