Android接收蓝牙数据的反转义编码

编辑记录:2019/10/27–1
之前还是大意了,少加了一个条件,导致返回的数据量不正确。在循环结束后加了一个continue,检索过程中,没遇到需要转义的字符就直接跳过
编辑记录:2019/10/27–2
脑壳昏了,记录需要反转义的字符位置应该放在循环的一开始就赋值,不然就错位了。其实就是检索到需要反转义的字符的索引,直接用i也可以。
编辑记录:2019/10/28
转码的规则整错老,我滴妈,我说怎么数量总不对
0xdb 0xe7–>0xbd;
0xdb 0xe8–>0xbe;
0xdb 0x00–>0xdb;

感谢各种语言在线编辑测试网站,太好用了
还是那个安卓×光谱仪蓝牙通讯的项目,由于返回的byte数组数据中包含转义编码,因此,要获得正确的数据,需要对数据进行反转义编码,规则是

//两个byte转为一个byte
0xdb 0xe7-->0xbd;
0xdb 0xe8-->0xbe;
0xdb 0x00-->0xdb;

下面是源码

import java.io.*;
import java.util.Arrays;
class test  
{
	public static void main (String[] args) throws java.lang.Exception
	{
	    final byte[] test=new byte[10];
	    test[0]=(byte)0xbd;
	    test[1]=(byte)0xbe;
	    test[2]=(byte)0xdb;
	    test[3]=(byte)0x1b;
	    test[4]=(byte)0xe7;
	    test[5]=(byte)0x1b;
	    test[6]=(byte)0xe8;
	    test[7]=(byte)0x1b;
	    test[8]=(byte)0x00;
	    test[9]=(byte)0x09;
	    byte[] res=new byte[10];
	    res=tByteData(test);
	   //int indexBD=getIndex(test,(byte)0xbd);
	    //System.out.println("index of 0xbd: "+indexBD);
	    //int indexBE=getIndex(test,(byte)0xbe); 
	    System.out.println("before: "+Arrays.toString(test));
		System.out.println("after:      "+Arrays.toString(res));
	}
	
public static int getIndex(byte[] arr, byte value) {
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] == value) {
            return i;
        }
    }
    return -1;//如果未找到返回-1
}

public static byte[] tByteData(byte[] src){
	int len=src.length;
	byte[] tmpSrc=new byte[len];
	for(int j=0;j<len;j++){
	    tmpSrc[j]=src[j];
	}
	int pos=0;
	int count=0;
	for(int i=0;i<len-count;i++){
		pos=i;//这个放这里,记录需要反转义的字符位置
		if(tmpSrc[i]==(byte)0xdb && tmpSrc[i+1]==(byte)0xe7){

			System.arraycopy(tmpSrc,pos+2,tmpSrc,pos+1,len-pos-2);
			tmpSrc[i]=(byte)0xbd;
		}
		else if(tmpSrc[i]==(byte)0xdb && tmpSrc[i+1]==(byte)0xe8){
			
			System.arraycopy(tmpSrc,pos+2,tmpSrc,pos+1,len-pos-2);
			tmpSrc[i]=(byte)0xbe;
		}
		else if(tmpSrc[i]==(byte)0xdb && tmpSrc[i+1]==(byte)0x00){
			
			System.arraycopy(tmpSrc,pos+2,tmpSrc,pos+1,len-pos-2);
			tmpSrc[i]=(byte)0xdb;
		}
		else{
		    continue;
		}
		count++;
	}
	byte[] res=new byte[len-count];
	System.arraycopy(tmpSrc,0,res,0,len-count);
	//return tmpSrc;
	return res;
}
	
	public static byte[] getByteData(byte[] src){
	    byte[] tmp=new byte[4096];
	    int indexBD=getIndex(src,(byte)0xbd);
	    int indexBE=getIndex(src,(byte)0xbe);
	    //Arrays.copyOf()
	    return tmp;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值