根据下面的示例,我能够创建一个包含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。在此先感谢您的帮助。
答案 0 :(得分:0)
经过实验,我发现以下解决方案有效:
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
互斥)。