By Tag you mean the last five bits (4 to 0) of the Identifier octet (where bits 7-6 are the Class, and bit 5 is the Primitive/Constructed bit), right?
Dear Mr. Lascu:
Yes, that's right, but it's not quite as simple as you've expressed it. There can be long tags and there can be multiple tags. You would do well to review the tag sections of one of the ASN.1 reference manuals which OSS makes freely available for download. Please visit www.oss.com.
I thought those are used to tell the type of the member, according to this table:
BOOLEAN = 0x01 INTEGER = 0x02 BIT_STRING = 0x03 OCTET_STRING = 0x04 NULL = 0x05 OBJECT_ID = 0x06 REAL = 0x09 ENUMERATION = 0x0A UTF8_STRING = 0x0C GENERAL_STRING = 0x1B SEQUENCE = 0x10 SET = 0x11
These are the UNIVERSAL tags, the default tags. They are not useful when they are not unique enough (for example, if I have multiple optional INTEGERs in a SEQUENCE). You therefore begin by making sure that your tags are unique enough. A good way is to just assign each element a tag beginning with [0] and incrementing it by 1. This ensures uniqueness within the SEQUENCE and you don't have to think about it. Just do it and forget about the question of whether it's unique enough. You then tell the type of the element by comparing its tag with the tags which would be expected.
For all my real members I set the the Identifier octet field to 0000 1001 (Universal, primitive, real number). Is there a way to embed the index of the member within the sequence in the Tag part as well?
No, you don't want an index. That's not the BER way. It would create an invalidly encoded SEQUENCE. You instead want a tag which is unique. Take the following example.
Z ::= SEQUENCE {
a [0] IMPLICIT INTEGER OPTIONAL, -- tag would be 80
b [1] IMPLICIT INTEGER OPTIONAL, -- tag would be 81
c [2] IMPLICIT INTEGER OPTIONAL -- tag would be 82
}It shows that I am replacing the default [UNIVERSAL 2] tags with [0], [1], or [2], as the case may be.
Using Z above as an example, if I were to decode
30 06 80 01 05 82 01 07
I would know that a is present (and has the value 5), b is absent, and c is present (and has the value 7).
You can also do it with EXPLICIT tags, where you keep the original UNIVERSAL tags but also add another tag. You might find this easier to use to identify the type but it adds a lot more octets to the encoding. It would look like this
Y ::= SEQUENCE {
d [0] INTEGER OPTIONAL, -- two tags, 80 and 02
e [1] INTEGER OPTIONAL, -- two tags, 81 and 02
f [2] INTEGER OPTIONAL -- two tags, 82 and 02
}In this case, where two tags are used, it takes the form TLTLV where the ending TLV becomes the V for the first TL. That is, the first tag sort of wraps the second. Using Y as an example, if I were to decode
30 0A 80 03 02 01 05 82 03 02 01 07
I would know that d is present (and has the value 5), e is absent, and f is present (and has the value 7).
Since this thread has evolved from representing REALs to working with tags, I avoided using REALs in the examples above. It would just confuse things, particularly for folks who didn't catch your initial question.
===================================================================== 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
