问题:如何在kaitai中写`010 switch and if`

Posted

技术标签:

【中文标题】问题:如何在kaitai中写`010 switch and if`【英文标题】:Question: How to write `010 switch and if` in kaitai 【发布时间】:2021-02-10 20:54:43 【问题描述】:

我非常喜欢 kaitai 结构,我需要在 kaitai 中重写 010 二进制模板之一。我在我的 010 模板中发现了类似于以下的结构,我想知道如何在 kaitai 中处理它。

例如:1

typedef struct

    WORD MCC_length;
    if(MCC_length>3)
    
        UBYTE MCC[3];
    
    else if(MCC_length>0)
    
        UBYTE MCC[MCC_length];
    
    else if(MCC_length==0)
    
        UBYTE MCC[3];
    
    
       WORD MNC_length;
    if(MNC_length>3)
    
        UBYTE MNC[3];
    
    else if(MNC_length>0)
    
        UBYTE MNC[MNC_length];
       
    else if(MNC_length==0)
    
        UBYTE MNC[3];
    
PLMN_Format_2;

例如:2

typedef struct

    UBYTE M_ID;
    UBYTE Cell_1;
    UBYTE Cell_2;
    UBYTE Cell_3;
    UBYTE T_Count;
    if(T_Count>0)
    
        INTER_MR_Cell cell_info[T_Count]<optimize=false>;
    
    UBYTE Location_ID;
    if(Location_ID == 1)
    
        UBYTE ShapeID;
        switch(ShapeID)
        
            case 0:
            
                UNDEFINED_INFO Undefined_Info;
                break;
            
            case 1:
            
                Type_Point_Info1 Point_Info1;
                break;
            
            case 2:
            
                Type_Point_Info2 Point_Info2;
                break;
            
            case 3:
            
                Type_Point_Info3 Point_Info3;
                break;
            
            case 4:
            
                Type_Loc_Info1 Loc_Info1;
                break;
            
            case 5:
            
                Type_Loc_Info2 Loc_Info2;
                break;
            
        
    
PERIOD_MDT;

【问题讨论】:

【参考方案1】:

我在 kaitai git 中问过同样的问题,他们提供了非常详细的解释说明如何做到这一点。 Please refer this

【讨论】:

以上是关于问题:如何在kaitai中写`010 switch and if`的主要内容,如果未能解决你的问题,请参考以下文章

在stm32上使用kaitai struct

更好地理解 Kaitai Struct 的 32 位转换器

kaitai struct 中实现了哪些解析器技术?它是不是实现回溯?

Python:使用 Kaitai Struct 读取 ID3v1 标签

在报表中写数据

switch语句与for语句的区别,能举例说明吗?谢啦!