You are right, it is a '}' and not a ')'. Just a typo. However, everything else is exactly the same as the DATEX-ASN.1 standard is describing the Time type. I thought that the "DEFAULT{0}" at the end means in fact
time-SecondFractions CHOICE { deci-seconds INTEGER (0..9) DEFAULT{0}, centi-seconds INTEGER (0..99) DEFAULT{0}, milliseconds INTEGER (0..999) DEFAULT{0} }
And this is the case that confuses me - if on the encoding side I have the chosen sub-field being the millisecond with a value of 0, I will not encode anything. On the decoding side I can figure out that the CHOICE was skipped because the chosen field had the default value (I also know the value - zero - but I don't know which one was the chosen field).
Things are even worse in this case:
time-SecondFractions CHOICE { deci-seconds INTEGER (0..9) DEFAULT{1}, centi-seconds INTEGER (0..99) DEFAULT{2}, milliseconds INTEGER (0..999) DEFAULT{3} }
There is something that I am missing.
Yes, you're missing that the default is not just an INTEGER value.
The correct ASN.1 would be something like this
time-SecondFractions CHOICE {
deci-seconds INTEGER (0..9),
centi-seconds INTEGER (0..99),
milliseconds INTEGER (0..999) } DEFAULT deci-seconds: 0There are no brackets, whether () or {} around the default value and there must be a choice made (the name before the colon) and then that choice takes a value (the thing after the colon). Look at it this way:
The element time-SecondFractions is a CHOICE. The first step is assigning a value to a CHOICE is to choose one of the elements. The second step is to provide a value for that element. Thus, if our SEQUENCE were to look like this (automatic tags assumed)
Time ::= SEQUENCE {
hours INTEGER,
minutes INTEGER,
seconds INTEGER,
time-SecondFractions CHOICE {
deci-seconds INTEGER (0..9),
centi-seconds INTEGER (0..99),
milliseconds INTEGER (0..999)
} DEFAULT deci-seconds: 0
}we could have a value described in value notation like this
t Time ::= { hours 12,
minutes 0,
seconds 0,
time-SecondFractions centi-seconds: 150
}Note that the value of time-SecondFractions is not just 150, it's centi-seconds:150; that is, we first choose centi-seconds from among the three choices, then assign a value to centi-seconds. Likewise we might have
u Time ::= { hours 12,
minutes 0,
seconds 0,
time-SecondFractions deci-seconds: 12
}where we have chosen deci-seconds and assigned it a value of 12.
A value of 12 for time-SecondsFractions has no meaning (or, at best, an ambiguous meaning) since we can't tell whether it's 12 deci-seconds, 12 centi-seconds, or 12 milli-seconds.
When we bring DEFAULT into the picture, all we're saying is (excuse the lack of precision) that time-SecondFractions is an optional field, which
when present, takes the value given, but when absent, takes the value specified as the default. So the question is: what kind of default value should time-SecondFractions take? As we already established above, it can't take a value of 0 since it's ambiguous; it must take a value which specifies (a) which element is chosen and (b) the value that the chosen element should take.
If I explained this well enough, you'll see that in the definition of Time above, even when time-SecondFractions is absent, it takes the default value of deci-seconds:0. Your decoder would therefore have to make it clear to the application that deci-seconds is the chosen and 0 is the value of deci-seconds.
You mentioned that you took the ASN.1 straight from the DATEX standard. If that's correct, the standard is faulty.
If you'd like further help, consider sending the entire ASN.1 file to me.
===================================================================== Conrad Sigona Voice Mail : 1-732-302-9669 x400 OSS Nokalva Fax : 1-614-388-4156 [EMAIL PROTECTED] My direct line : 1-315-845-1773 _______________________________________________ ASN1 mailing list [email protected] http://lists.asn1.org/mailman/listinfo/asn1
