数据传输设计

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[]保存的数值

 

 

 

上一篇:【ECMAScript5】对象


下一篇:高性能环形缓冲区设计