Date: 2005-02-20T07:03:41
Editor: EmmanuelLecharny
Wiki: Apache Directory Project Wiki
Page: TLVPageInfo
URL: http://wiki.apache.org/directory/TLVPageInfo
no comment
Change Log:
------------------------------------------------------------------------------
@@ -98,32 +98,25 @@
The last point is that a primitive value has a fixed size, given by the '''Lengh''' part
of the '''TLV'''. It will be used for ''constructed values''.
==== Constructed Value ====
-Constructed values are '''TLV''' with inner '''TLVs''' in its '''Value'''. It ha a '''Length'''
which is the sum of all its inner '''TLVs'''. A bit is set in the '''Tag''' to distinguish
a ''Constructed value'' from a ''Primitive value'' : the 5th bit of the first tag's byte.
In the sample, the first '''TLV''' tag is ''30'', which can be read 00__'''1'''__1-0000 binary.
The 5th bit (bold) is set : it's a ''constructed value''.
+Constructed values are '''TLV''' with inner '''TLVs''' in its '''Value'''. It has a '''Length'''
which is the sum of all its inner '''TLVs'''. A bit is set in the '''Tag''' to distinguish
a ''Constructed value'' from a ''Primitive value'' : the 5th bit of the first tag's byte.
In the sample, the first '''TLV''' tag is ''30'', which can be read 00__'''1'''__1-0000 binary.
The 5th bit (bold) is set : it's a ''constructed value''.
+=== Decoding TLVs ===
+For any further information, one should read [http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf]
which explain BER encoding, but be aware that you also need to read [http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf].
They are available for free, which is quite cheap compared to sleeping pills !
-(TODO : replace the total BS below ...)
-
-What about the '''Values'''? '''Length''' was easy, it was totally context-free. Which kind
of '''Value''' can we have? How do we know the type of each '''Value'''?
-
-First, we have seen that some '''Values''' are composed with '''TLVs'''. But we must have
some kind of primitive '''Values''', like ''integer'' or ''string''?
-
-The '''Tag''' element is the key. It give the type of the '''Value'''. In the previous picture,
for instance, the second '''TLV''' code for an integer : ''''02'''' means "I contain an integer".
One can read ''''02 01 01'''' as "''An integer (02) which is 1 byte long (01) and which value
is 1 (01)''".
-
-So, let's see other '''Tags''' : 04 code for an ''Octet String''. Here, we have two empty
strings : ''Octet String'' (04) zero '''Length''' (00) in the two last '''TLVs'''
+Decoding a ''Primitive Value'' is somehow easy. Decoding a ''Constructed Value'' is a recursive
process. We can't simply write a function that decode a '''TLV''' which call itself recursivly,
it's too expensive and does not allow to treat deeply recursive '''TLV''' in a constrained
memory environment.
-0A (fourth '''TLV''') means ''Enumerated''. This is a way to code a constrained value (i.e
something in a set of values). Here, it's a 0 : ''An enumerated (0A) value which is 1 byte
long (01) and which value is 0 (00)''. It does not give you a lot of information, as you can
see: which kind of value is it suppose to be?
+We will use a stack which will store the current '''TLV''' until they are totally decoded
(a totally decoded '''TLV''' is either a ''Primitive'', or a ''Constructed'' which value has
been read).
-So far, so good, we have a kind of way to decode simple '''TLV'''. Let's call them '''Primitive'''.
What about '''TLVs''' that contains other '''TLVs'''? We will call them '''Constructed'''
+The '''TLV''' we exposed on top of this page could be seen as a tree. To decode it, we need
to walk this tree. The next picture show the sample as a tree :
-The first '''TLV''' has a '''Tag''' value of 30. This is a ''SEQUENCE'' of '''TLVs'''. A
''SEQUENCE'' is constructed by ordered '''TLVs'''. We can't exchange two '''TLVs''' in a ''SEQUENCE'',
there is another '''Tag''' for that : a ''SET''.
+attachment:TlvTree.png
-The last '''TLV''' has a '''Tag''' value of 61. This is specific of a '''CHOICE''', where
you have to choose between different cases, and here it's the first value that has been chosen
(we can read 61 has a '''SEQUENCE''' number 1 of the alternative. Accept the explanation,
it's quite complicated to give the reason why 61 is a '''SEQUENCE''' while 30 is also a '''SEQUENCE''').
+Each '''TLV''' in this picture has two length : the inner length (''l'', blue) and the outer
length (''L'', red). Inner length is the '''Length''' part of a '''TLV'''. Outer length equals
length('''Tag''') + length('''Length''') + inner length. We can see that the inner length
of a constructed '''TLV''' equals the sum of all the outer length of each of its children.
+This drive us to the fact that a constructed '''TLV''' is totally decoded when this sum equals
its inner length.
-For any further information, one should read [http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf]
which explain this encoding, but be aware that you also need to read [http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf].
They are available for free, which is quite cheap compared to sleeping pills !
+The next picture show the stack trace created while decoding the sample '''TLV''' :
-=== Decoding TLVs ===
+attachment:TlvStack.png
=== Encoding TLVs ===
-
-=== TLVs : Novlang ? ===
|