Как преобразовать распакованный массив в одно значение с помощью Ruby?

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

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

Решение

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
Другие вопросы по тегам