我正在学习写asn.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
}
}}
发布于 2016-05-02 08:03:35
我会将ENUMERATED用于游戏播放器类型。playerDetail中的差异可以通过OPTIONAL成员来解决。游戏玩家的数组将由SEQUENCE OF解决。
这是ASN.1模块的示例(我还没有测试它是否正确) GamePlayerModule
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发布于 2016-05-14 23:28:39
在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可能是一种让您将这些项目混合在一起的合适方法。(如果你想让人类接管一个人工智能玩家,你可能会考虑会发生什么。)
在大多数协议中,IP地址被指定为OCTET STRING是典型的,但这是一个实现细节。
有一套很好的在线资源可供学习ASN.1:参见本教程获得一些快速的东西;雅茅斯氏和杜布松氏病的书籍也在线。拉茅斯更容易接近,但杜布松可能更彻底。
https://stackoverflow.com/questions/36976371
复制相似问题