title: Tipo-longitud-valor
text: # 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
  