TLV格式和TLV在PHP5中的应用,
讲到TLV格式可能很多人都没有听说过吧。不过不要紧,今天我们就一直来了解它。
TLV是一种可变格式,主要用到在客服端与服务端之间的数据发送。说道其本质是是客服端向服务段数据传输双方规定的一个协议。
TLV中T、L字段的长度往往固定(通常为1~4bytes),V字段长度可变。顾名思义,T字段表示数值类型,L字段表示数值长度、V字段往往用来存放数值。
T:Tag标识,用于标识该数据元,类似于数组中的key
L:Length长度,TLV中Value的长度
V:Value数据本身,其中Value本身也可以包含TLV
接下来我们以PHP形式的方式来讲解TLV,在PHP中TLV其表现形式可以用数组来表示,如下:
$tag = 0x103
$value = “Test TLV”;
$ret = array($tag,strlen($value),$value);
print_r($ret);
在这段代码中数据ret就是TLV在PHP中的表示。其中strlen($value)为TLV中的Length(T),其中需要注意的是$tag和length必须为int类型。当然这段代码并不完整。以下代码段是对TLV进行了处理的TLV。
/**
TLV包解析类
*/
class Tlv {
private $buffer;
private $t_len = 4; //T长度
private $l_len = 4; //L长度
private $buf_len =0; //字节流长度
private $buf_array = array();
/**
* 构造函数
*/
function __construct(){}
/**
* 解析数据
*
* @param byte $buffer 二进制流数据
* @param $IsArray
* @return array
*/
function Read($buffer,$IsArray=false){
$this->buffer = $buffer;
$this->buf_len = strlen($this->buffer);
$isMore = false;
$tmp_array = array();
$tmp_key = "";
//清空数组
if(isset($this->buf_array)){
unset($this->buf_array);
$this->buf_array = array();
}
$i=0;
while($ibuf_len){
//获取TGA
$t = $this->getLength($i,$this->t_len);
if($this->toHex($t) == "0xffffffff") break;
$i += $this->t_len;
//获取Length
$l = $this->getLength($i,$this->l_len);
$i += $this->l_len;
//获取Value
$v = substr($this->buffer,$i,$l);
$i += $l;
if($IsArray){
$this->buf_array[$this->toHex($t)] =array($this->toHex($t),$l,$v);
}else{
array_push($this->buf_array,array($this->toHex($t),$l,$v));
}
}
return $this->buf_array;
}
//将数组转换二进制数据
function Write($arrdata){
$i = 0;
$msg = null;
while($i