类型 - 长度 - 值与已定义/结构化长度 - 值

时间:2012-07-03 14:20:49

标签: protocols data-representation tlv

毫无疑问,数据的长度值表示是有用的,但是类型长度值有什么优势呢?

当然,使用LV需要预定义或结构化表示,但这几乎不是问题。实际上,我不能想到一个足够好的案例,它不会被定义为需要TLV。

就我而言,这是关于数据交换/协议。在任何情况下,必须为双方都知道要处理的表示,这消除了对显式插入数据的类型的需要。关于何时该类型有用或必要的任何想法?

修改
我应该提一下,通用的解析器/处理器肯定会受益于类型信息,但这不是我的情况。

2 个答案:

答案 0 :(得分:1)

我能想出的唯一正当理由是数据的通用处理器,主要用于调试或直接用户演示。将数据嵌入数据中将允许处理器正确处理数据,而无需预先定义所有可能的结构。

答案 1 :(得分:0)

维基百科中提到了以下几点。

可以安全地跳过在较旧节点上接收的新消息元素,并且可以解析消息的其余部分。这类似于可以安全地跳过未知XML标记的方式;

实施例: 想象一下打电话的消息。在系统的第一个版本中,这可能使用两个消息元素,“命令”和“phoneNumberToCall”:

command_c / 4 / makeCall_c / phoneNumberToCall_c / 8 / “722-4246” 这里command_c,makeCall_c和phoneNumberToCall_c是整数常量,4和8分别是“value”字段的长度。

稍后(在版本2中)可以添加包含主叫号码的新字段: command_c / 4 / makeCall_c / callingNumber_c / 8 / “715-9719”/ phoneNumberToCall_c / 8 / “722-4246”

从版本2系统接收消息的版本1系统将首先读取command_c元素,然后读取类型为callingNumber_c的元素。

版本1系统无法理解; callingNumber_c 所以读取长度字段(即前8个),系统向前跳过8个字节进行读取 它理解的phoneNumberToCall_c和消息解析继续进行。

如果没有type字段,版本1解析器就不会知道跳过callingNumber_c而是调用错误的数字,并可能在消息的其余部分抛出错误。因此,类型字段允许以省略它的方式向前兼容。