Как преобразовать распакованный массив в одно значение с помощью Ruby? - PullRequest
1 голос
/ 02 апреля 2012

Я пытаюсь преобразовать распакованное значение в 4-х байтовый массив?Возможно ли это в Ruby?

скажем, я написал b1 = b.unpack("N") и выведите значение b1, равное 1.Но когда я пытаюсь преобразовать b1 в некоторое целое число, используя консоль .to_i, выдает ошибку test.rb:13: undefined method to_i 'для [118]: 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 Ответ

1 голос
/ 02 апреля 2012

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
...