代码之家  ›  专栏  ›  技术社区  ›  Gopi

使用asn.1的结构数组

  •  3
  • Gopi  · 技术社区  · 8 年前

    我正在学习写作。1语法。我希望如果asn。1提供了写入序列数组的功能。它有一种相同类型结构的图案,反复重复,但有细微的修改。我想知道是否ASN。1允许我编写数组类型的语法以适应少数语法,而不是编写这么大的语法。

    gamePlayer {
    gamePlayer {
        gamePlayer type: user (0)
        playerDetail  {
            name: player_1
            team: red
            ip: 10.3.3.1
            membership: level_2
        }
    }
    gamePlayer {
        gamePlayer type: user (0)
        playerDetail  {
            name: player_2
            team: blue
            ip: 10.3.3.2
            membership: level_4
        }
    }
    gamePlayer {
        gamePlayer type: ai (1)
        playerDetail  {
            name: ai_1
            team: red
            bot: bikeBot
        }
    }
    gamePlayer {
        gamePlayer type: ai (1)
        playerDetail  {
            name: ai_2
            team: blue
            bot: bikeBot
        }
    }
    gamePlayer {
        gamePlayer type: ai (1)
        playerDetail  {
            name: ai_3
            team: blue
            bot: carBot
        }
    }
    

    }

    2 回复  |  直到 8 年前
        1
  •  4
  •   pepo    8 年前

    我会用 ENUMERATED 对于游戏玩家类型。playerDetail中的差异可以用解决 OPTIONAL 成员。游戏玩家阵列将由 SEQUENCE OF .

    这是ASN的示例。1个模块(我没有测试是否正确) 游戏播放器模块

    DEFINITIONS IMPLICIT TAGS ::= BEGIN
    
    GamePlayers ::= SEQUENCE OF GamePlayer
    
    Gameplayer ::= SEQUENCE {
       type ::=         ENUMERATED
                           {
                              user  (0)
                              ai    (1)
    
                           },
       playerDetail     PlayerDetail
    }
    
    PlayerDetail ::= SEQUENCE {
        name            UTF8STRING,
        team            UTF8STRING,
        ip          [0] UTF8STRING OPTIONAL,
        membership  [1] UTF8STRING OPTIONAL,
        bot         [2] UTF8STRING OPTIONAL
    }
    
    END
    
        2
  •  2
  •   Ethan    8 年前

    ASN.1中有很多方法可以剥这只猫的皮。一种方法:

    Player ::= SEQUENCE {
        name    UTF8String,
        team    UTF8String,
    
        humanOrAI CHOICE {
           human [0] HumanInfo,
           ai    [1] AIInfo
        }
    }
    
    HumanInfo ::= SEQUENCE {
        ip         OCTET STRING (SIZE (4))
        membership UTF8String
    }
    
    AIInfo ::= ENUMERATED { bikeBot, carBot }
    

    使用 CHOICE 这可能是一种让您将这些项目混合在一起的合适方法。(如果你想让人类接管AI玩家,你可以考虑会发生什么。)

    IP地址通常指定为 OCTET STRING 在大多数协议中,这是一个实现细节。

    有一套很好的在线资源可用于学习ASN。1: 参见 this tutorial 为了一些快速的东西; Larmouth's Dubuisson's 书也在网上。拉茅斯更容易接近,但杜比森可能更彻底。