Tipo-longitud-valor
# Tipo-longitud-valor

En el ámbito de los protocolos de comunicaciones, se denomina tipo-longitud-valor (del inglés type-length-value, comúnmente simbolizado como TLV) o valores de longitud tipo a un formato de representar información, de forma que haya información que pueda tener presencia opcional y longitud variable.

Los tipos (tags) y las longitudes suelen ser de longitud establecida, pero el valor (la información real) es de longitud variable y es determinada por el campo "longitud".

Cada "tupla" de información codificada de esta forma se compone de tres partes:

* Tipo ('tag): código que indica el dato que se está codificando.
* Longitud (length): longitud del dato a codificar (Suele estar indicada en bytes).
* Valor (value): valor a codificar.

## Ventajas

* Una secuencia de datos codificada en TLV es fácil de interpretar.
* Se pueden añadir tags a los mensajes sin hacer que el mensaje sea incompatible hacia atrás.
* La redudancia de datos al codificar en TLV es muy baja y suele ser menor que en XML.
* Permite anidar estructuras, de forma que el dato de un TLV puede ser a su vez otro TLV.
* Es fácil saber si el mensaje ha llegado completamente sin necesidad de carga extra.

## Inconvenientes

* No es un formato "amigable a humanos", pues es difícil decodificar un mensaje al verlo, al contrario que en XML.

## Usos comunes

* Codificación BER.
* Codificación DER.
* Codificación CER.
* Codificación que utiliza CDP en los mensajes de publicación de Routers CISCO, para proporcionar información acerca de los dispositivos vecinos, es decir, que se encuentran directamente conectados entre sí.

## Ejemplo

Un ejemplo básico de lo que podría ser un mensaje TLV es el siguiente, aunque no está optimizado para primar la claridad:

Para representar una persona de 30 años, que se casó el 28 de julio de 1900, cuyo nombre Pedro y se casó con Carmen, pueden usarse estos tags:

* 01 significa "persona" (que contiene una edad, una fecha de casarse, el nombre de la persona y el nombre de la persona con quien se casa).
* 20 significa "edad" (dos dígitos por byte, en años).
* 21 significa "fecha de matrimonio" (dos dígitos por byte, codificado DD/MM/AAAA).
* 22 significa "nombre" (un carácter por byte).
* 23 significa "nombre de la persona con quien se casa" (un carácter por byte).

El mensaje quedaría en formato binario. Por claridad, se representa aquí un ejemplo de mensaje en ASCII:

    01 24 20 01 30 21 04 28 06 19 90 22 05 P e d r o 23 06 C a r m e n

Descomponiéndolo en partes quedaría de la siguiente forma.

| TAG | LONGITUD | VALOR | Interpretación |
| - | - | - | - |
| 01 | 24 | 20 01 30 21 04 28 06 19 00 22 05 P e d r o 23 06 C a r m e n | Debe descomponerse más. "Persona" tiene más cosas dentro |
| 20 | 01 | 30 | Edad: 30 años |
| 21 | 04 | 28 06 19 90 | Fecha de la boda: día 28, mes 06, año 1990 |
| 22 | 05 | P e d r o | El nombre de la persona: Pedro |
| 23 | 06 | C a r m e n | Nombre de la persona con quien se casa: Carmen |

La cadena podría dividirse también en varios TLV para así poder añadir precisión en caso de requerirse (por ejemplo la hora).

* Datos: Q1544297
