Pozn. předem: IA5String je ve zkratce řetězec ASCII znaků, jen lehce jinak formalizovaný (https://en.wikipedia.org/wiki/IA5STRING) ASN.1 definice protokolu: UPSChatProtocol DEFINITIONS ::= BEGIN MessageType ::= IA5String( "nick" | "chat" | "conn" | "disc" | "exit" ) NickType ::= IA5String(SIZE(4..32)) MessageParameter ::= SEQUENCE { key IA5String ("color" | "tsize"), value IA5String (SIZE(1..99)) } MessageHeader { MessageType:Type } ::= SEQUENCE { magic IA5String ("KIVUPS"), command Type, totalLength INTEGER(0..9999) } NickMessage ::= SEQUENCE { header MessageHeader{{"nick"}}, newNick NickType, oldNick NickType OPTIONAL } ChatMessage ::= SEQUENCE { header MessageHeader{{"chat"}}, message IA5String (SIZE(1..999)), parameters SEQUENCE(SIZE(0..10)) OF MessageParameter } ChatMessageSrv ::= SEQUENCE { header MessageHeader{{"chat"}}, nick NickType, message IA5String (SIZE(1..999)), parameters SEQUENCE(SIZE(0..10)) OF MessageParameter } ConnDisconnMessage ::= SEQUENCE { header MessageHeader{{"conn" | "disc"}}, nick NickType } ExitMessage ::= SEQUENCE { header MessageHeader{{"exit"}}, reason IA5String (SIZE(1..99)) } END Příklad zprávy (ASN.1 value notation): value ChatMessage ::= { header { magic "KIVUPS", command "chat", totalLength 41 }, message "Chatova zprava", parameters { { key "color", value "blue" }, { key "tsize", value "large" } } } XER:
KIVUPS chat 41
Chatova zprava color blue tsize large
BER (hex dump): 30443011 16064B49 56555053 16046368 61740201 29160E43 6861746F 7661207A 70726176 61301F30 0D160563 6F6C6F72 1604626C 7565300E 16057473 697A6516 056C6172 6765 UER (viz níže): KIVUPSchat00410014Chatova zprava2color04bluesize05large https://asn1.io/asn1playground/ -------------------------------------------------------------------------------------------------------------------- = UER (UPS Encoding Rules) Hodnoty jsou přepsány přímo do výsledného zakódovaného PDU v tisknutelných ASCII znacích. Řetězce nejsou zakončeny nulovým znakem. == Použité výrazy a symboly n = skutečná velikost sekvence p = dolní hranice délky sekvence q = horní hranice délky sekvence SEQUENCE_VALUE = fyzická hodnota sekvence SEQUENCE_VALUE(p..q) = fyzická hodnota sekvence v prvcích od indexu p do indexu q ToIA5String(num) = převod čísla num do ASCII řetězce; volitelně lze výstup formátovat modifikátory WIDTH a PADDING WIDTH(a) = pevná délka 'a' formátovaného výstupu v bajtech po převodu na znaky PADDING(b) = výplň znakem 'b' při zvolení fixního výstupu == Přepisovací pravidla IA5String(SIZE(n)) = SEQUENCE_VALUE(0..n) IA5String(SIZE(p..q)) = INTEGER(p..q) SEQUENCE_VALUE(0..n) IA5String(a1 | a2 | ... | an) && STRLEN(a1) == STRLEN(a2) == ... == STRLEN(an) = IA5String(SIZE(an)) INTEGER(p..q) && q < 10 = ToIA5String(SEQUENCE_VALUE) INTEGER(p..q) && q < 100 = ToIA5String(SEQUENCE_VALUE, WIDTH(2), PADDING('0')) INTEGER(p..q) && q < 1000 = ToIA5String(SEQUENCE_VALUE, WIDTH(3), PADDING('0')) INTEGER(p..q) && q < 10000 = ToIA5String(SEQUENCE_VALUE, WIDTH(4), PADDING('0')) SEQUENCE(SIZE(p..q)) = INTEGER(p..q) SEQUENCE_VALUE(0..n)