编辑记录: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;
}
}