数据传输设计

8 篇文章 0 订阅

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值