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

Posted

技术标签:

【中文标题】如何使用 Ruby 将解压缩的数组转换为单个值?【英文标题】:How to convert unpacked array to single value using Ruby? 【发布时间】:2012-04-02 10:45:41 【问题描述】:

我正在尝试转换 4 字节数组的解压值?这在 Ruby 中可行吗?

假设我写了 b1 = b.unpack("N") 并打印了 b1 的值,即 1 。但是当我尝试使用 .to_i 将 b1 转换为某个整数时,控制台会抛出错误 test.rb:13: undefined methodto_i' for [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

【问题讨论】:

b1 是一个数组; to_i 是什么意思?如果你想要它作为一个整数,你需要使用b1[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

以后通过 print 语句调试你的程序时,使用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

【讨论】:

以上是关于如何使用 Ruby 将解压缩的数组转换为单个值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Postgres 中将布尔数组转换为单个布尔值或单个字符串

Ruby:将String转换为嵌套数组的Integer值

如何用ps把拍摄的格式的图片转换为单个的png?

使用 PHP 中的 foreach 循环将数组值转换为单个数组

如何将 UTF8 组合字符转换为 ruby​​ 中的单个 UTF8 字符?

Ruby .store 函数将哈希值从数组更改为单个值