使用 BinData 读取时跳过字节



所以我有这样的记录:

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 后停止读取,只有当 :name 等于某个值时?还是一旦您开始读取带有记录的文件,它就必须一直运行?

我知道我可以使用 :onlyif 跳过所有剩余的内容,但是有没有办法将 :onlyif 放在之后的所有内容上?你能在选择上放一个:onlyif吗?

我尝试过的代码:

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 "IntPropertyx00"
        float "FloatPropertyx00"
        struct "StrPropertyx00" do
            int32 :len
            string :data, read_length: :len
        end 
        struct "NamePropertyx00" do
            int32 :len
            string :data, read_length: :len
        end
        struct "ArrayPropertyx00" do
            int32 :num_items
            array :properties, type: :property, initial_length: :num_items
        end
    end
    def not_none?
        name != 'Nonex00'
    end
end

我还尝试将所有内容放在 :name_len 和 :name 下方,并执行此操作:

class Property < BinData::Record
    endian :little
    string_record :name
    property_data :p_data, :onlyif => :not_none?
    def not_none?
        name.data != 'Nonex00'
    end 
end

但这不起作用,因为如果我将 PropertyData 记录放在上面(它必须是因为 Property 需要知道 PropertyData 是什么),那么它会出错,因为 PropertyData 需要知道属性是什么(因为它用该类型填充数组)。他们没有办法让彼此知道对方的存在,因为他们都互相使用。

[T]他不起作用,因为如果我把 PropertyData 记录放在上面(它必须是因为 Property 需要知道 PropertyData 是什么),那么它会出错,因为 PropertyData 需要知道属性是什么(因为它用该类型填充数组)。

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

class PropertyData < BinData::Record; end # Forward declaration
class Property < BinData::Record
  endian :little
  # ...
end
class PropertyData < BinData::Record
  endian :little
  # ...
end

您可以在list.rb示例中看到同样的事情发生。

相关内容

  • 没有找到相关文章

最新更新