使用BinData读取时跳过字节

时间:2016-06-08 03:05:46

标签: ruby bindata

所以我有一个类似的记录:

/dbdata:/data mydb:latest

有没有办法让我在读取之后停止从Record中读取:name_len和:name,仅当:name等于某个值?或者,一旦你开始阅读带有记录的文件,它必须一直运行吗?

我知道我可以使用:只能跳过所有剩下的,但有没有办法把:onlyif放在后面的所有内容上?你能选择:onlyif吗?

我试过的代码:

class Property < BinData::Record
    endian :little

    int32  :name_len
    string :name, read_length: :name_len

    # want to quit here.

    int32 :type_len
    string :type, read_length: :type_len
end

我还尝试将所有内容放在:name_len和:name in it自己的Record中并执行此操作:

class Property < BinData::Record
    endian :little

    int32  :name_len
    string :name, read_length: :name_len

    int32 :type_len, :onlyif => :not_none?
    string :type, read_length: :type_len, :onlyif => :not_none?

    int64 :data_len, :onlyif => :not_none?    
    choice :data, :onlyif => :not_none?, selection: :type do
        int32 "IntProperty\x00"

        float "FloatProperty\x00"

        struct "StrProperty\x00" do
            int32 :len
            string :data, read_length: :len
        end 

        struct "NameProperty\x00" do
            int32 :len
            string :data, read_length: :len
        end

        struct "ArrayProperty\x00" do
            int32 :num_items
            array :properties, type: :property, initial_length: :num_items
        end
    end

    def not_none?
        name != 'None\x00'
    end
end

但是这没有用,因为如果我把PropertyData Record放在这个以上(因为Property需要知道PropertyData是什么),那么它就会出错,因为PropertyData需要知道什么是Property(因为它填充了具有该类型的数组)。他们无法相互认识,因为他们互相使用。

1 个答案:

答案 0 :(得分:0)

  

[T]他没有工作,因为如果我将PropertyData Record置于此之上(因为Property需要知道PropertyData是什么),那么它会出错,因为PropertyData需要知道属性是什么(因为它用这种类型填充数组。)

你可以通过在Property之前声明PropertyData类来解决这个问题,但是在之后填写它:

class PropertyData < BinData::Record; end # Forward declaration

class Property < BinData::Record
  endian :little

  # ...
end

class PropertyData < BinData::Record
  endian :little

  # ...
end

您可以在list.rb example中看到同样的事情。