一般为解码时将报文数组里的两位转为一位,编码时将一位转为两位。
具体情况试报文协议而定。
/**
* byte数组报文转义
* @param bs 整个byte数组,可包括不转义部分
* @param start 转义数组的开始位置
* @param end 转义数组的结束位置
* @return 转义后的整个数组
* @throws IOException
*/
public static byte[] doEscape(byte[] bs, int start, int end) throws IOException {
if (start < 0 || end > bs.length) {
throw new ArrayIndexOutOfBoundsException("doEscape error : index out of bounds(start=" + start
+ ",end=" + end + ",bytes length=" + bs.length + ")");
}
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
int i = 0;
//写入不需转义的前部分
for (; i < start; i++) {
outputStream.write(bs[i]);
}
//开始转义需要转义部分
for (i = start; i <=end; i++) {
//将接受到的0x7d0x01转为0x7d
if (bs[i] == 0x7d && bs[i + 1] == 0x01) {
outputStream.write(0x7d);
//多转几位,i加几
i++;
}//将接受到的0x0d转为0x0a0x01
else if (bs[i] == 0x0d) {
outputStream.write(0x0a);
outputStream.write(0x01);
} //写入不符合转义需求部分
else {
outputStream.write(bs[i]);
}
}
//写入不需转义的后部分
for (; i < bs.length; i++) {
outputStream.write(bs[i]);
}
return outputStream.toByteArray();
} catch (IOException e) {
throw new UnsupportedOperationException(e);
}
}