【问题标题】:BinData::Record with Array read fails while write worksBinData::Record 数组读取失败,而写入工作
【发布时间】:2014-04-25 22:06:27
【问题描述】:

根据下面的示例,我能够创建一个包含 BinData::Array 元素的新 BinData::Record,并且能够从该类类型的新对象创建二进制字符串。但是,当我尝试从该二进制字符串中实例化一个新对象时,新对象并未正确创建。

require 'bindata'

class IntegerArray < BinData::Array
  uint16le initial_value: 0
end

class Test < BinData::Record
  integer_array :field
end

obj = Test.new
obj[:field] << 15

str = obj.to_binary_s

puts obj.inspect # {"field"=>[15]}
puts str.inspect # "\x0F\x00"
puts str.unpack("S<*") # 15

newobj = Test.read(str)

puts newobj.inspect # {"field"=>[]}

我尝试删除数组的 initial_value,结果相同。提前感谢您的帮助。

【问题讨论】:

    标签: arrays binary-data bindata


    【解决方案1】:

    经过一番试验,我发现以下解决方案有效:

    require 'bindata'
    
    
    class NumberArray < BinData::Array
      uint16le initial_value: 0
    end
    
    class Test < BinData::Record
      number_array :field, read_until: :eof
    end
    
    obj = Test.new
    obj[:field].assign([1, 2, 3, 4, 5])
    
    str = obj.to_binary_s
    
    puts obj.num_bytes # 10
    puts obj.inspect # {"field"=>[1, 2, 3, 4, 5]}
    puts str.inspect # "\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00"
    
    newobj = Test.read(str)
    puts newobj.num_bytes # 10
    puts newobj.inspect # {"field"=>[1, 2, 3, 4, 5]}
    

    注意在定义数组字段时使用read_until: :eof。如果没有这个,读取操作将只读取到initial_length 的定义值(与read_until 互斥)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多