tlv格式
l转换
byte-len
长度信息保存到二进制byte[]
byte 有效值为-127~127,byte为8位二进制数,第一位作为符号位,0代表正数,1代表负数,1-8位,代表了0~(2^7-1=127)范围中的整数,
实际上8位二进制表示了256个数字,java默认byte为有符号整数
如果用来表示长度,不需要负数,那么1个byte可以表示数字范围是0~255
如果超过255呢,就多加一个字节,范围可以扩展.
1个字节,范围0`(2^8-1=255)
2个字节,范围0~(2^16-1=65535),
3个字节,范围0~(2^24-1=16,777,215)
...
基本上3个字节以内就够用了(3个字节最大表示差不多相当于16G长度[1G=2^20 byte])
根据数据长度len,选择字节长度并保存
//data 可以设置在2^24-1范围内任意长度
byte[] data=new byte[1024]
int len = data.length;
if ((len>>16)>0){
dataLen=3;
}else if ((len>>8)>0){
dataLen=2;
}else if (len>0){
dataLen=1;
}else {
dataLen=0;
}
byte[] dataLenByte=new byte[dataLen];
for (int i=0;i<dataLen;i++){
dataLenByte[i]= (byte) ((len>>(8*(dataLen-i-1)))&255);
}
//输出dataLenByte 就是保存了长度信息的byte[]
//dataLen是dataLenByte的长度信息
读取到长度信息以后如何解析长度
//element保存有长度信息和数据内容
//需要通过其他方式获取长度信息的字节长度
//这里假设dataByteLen已知,范围0~3
byte[] element;
byte[] byteLen=new byte[dataByteLen];
System.arraycopy(element,0,byteLen,0,dataByteLen);
int len=0;
for (int i=0;i<dataByteLen;i++){
int left=(8*(dataByteLen-i-1));
len+=(byteLen[i]<<left)&(255<<left);
}
//byteLen是长度信息byte[]
//dataByteLen长度byte[]的长度
//len是长度byte[]保存的数值