目标
一个个字节写入,满足条件后取出、清空准备写入下一个字节。
控制逻辑
不断的从外部读取字节放入缓存,每收到回车换行则完成一帧,从缓存剥离出来交付给下一个方法解析。
代码块
private ByteBuffer byteBuffer = ByteBuffer.allocate(300);//注意这里根据自己的需要预估大小
private byte b0d = (byte)0x0d,b0a = (byte)0x0a;//回车、换行字节,可以不需要我这样而直接写在代码里
private void doWithBytes(byte[] bytes){
for(byte b: bytes){
if (byteBuffer.position() > 0 && byteBuffer.get(byteBuffer.position() - 1) == b0d && b == b0a) {
Log.d(tag, "收到一帧的结尾了");
byteBuffer.put(b);
byte[] buf = new byte[byteBuffer.position()];//获得有效字节用的容器
byteBuffer.flip();//设置为可读取
byteBuffer.get(buf);//读取到有效字节
doWithSignal(buf);//交给下一个方法处理一帧
byteBuffer.clear();//清空缓冲区准备接收下一帧
} else {
byteBuffer.put(b);
}
}
}
小结
1,合理设置缓冲大小 2,没有方法进行剔除无效字节,也没有方法直接读取有效字节,只能通过position知道有效字节的截至位置,然后自行读取 3,get前要flip