protected Object decode(ChannelHandlerContext ctx, ByteBuf buffer) throws Exception { byte[] bytes = ByteBufUtil.getBytes(buffer); if (bytes.length < 6) { return null; } // 添加分隔符分割数据 if (RequestDispatcher.dispatcherDataByStartField(bytes, IB)) { if (bytes.length < (bytes[2] & 0xff) + 6) return null; else frameLength = (bytes[2] & 0xff) + 6; } else if (RequestDispatcher.dispatcherDataByStartField(bytes, KW)) { byte[] len = new byte[]{bytes[2], bytes[3]}; //Double length = (Double) ProtocolDataGenerator.getOneData(len, 0, 2, DataAnalyseWayEnum.UInt16); Double length = Double.parseDouble(ProtocolDataGenerator.getOneData(len, 0, 2, DataAnalyseWayEnum.UInt16).toString()); frameLength = length.intValue(); } else if (RequestDispatcher.dispatcherDataByStartField(bytes, KH)) { byte[] len = new byte[]{bytes[3], bytes[2]}; Double length = (Double) ProtocolDataGenerator.getOneData(len, 0, 2, DataAnalyseWayEnum.UInt16); frameLength = length.intValue(); } else if (RequestDispatcher.dispatcherDataByStartField(bytes, ATX, 0, 1)) { //处理粘包 if ((ATXProtocolUtil.AGREEMENT_START_CMD[0] == bytes[0]) && (ATXProtocolUtil.AGREEMENT_START_CMD[1] == bytes[1])) { //启动帧 if (H2TServer.channelPileMap.get(ctx.channel()) == null) { frameLength = ATXProtocolUtil.START_CMD_LENGTH; } } else { //U帧/I帧 frameLength = (Integer) ATXProtocolDataGenerator.getAllData(bytes, 1, 2, DataAnalyseWayEnum.UInt16) + 3; }}
时间: 2024-02-14 15:30:36 浏览: 98
完整详细版Python全套教学课件 第02节 内置数据结构04 bytes和bytearray.pptx
这段代码是一个解码方法,用于将字节数据解析成对象。它首先通过读取字节缓冲区获取字节数组,然后根据字节数组的长度进行判断处理。
如果字节数组长度小于6,则返回null。
接下来,根据不同的开始字段来判断数据的类型。如果是以IB作为开始字段,则判断字节数组长度是否大于等于该数据长度加6。如果满足条件,则设置帧长度为数据长度加6。
如果是以KW作为开始字段,则读取字节数组中的第2、3个字节作为数据长度,并将其转换为Double类型后取整得到帧长度。
如果是以KH作为开始字段,则读取字节数组中的第3、2个字节作为数据长度,并将其转换为Double类型后取整得到帧长度。
如果是以ATX作为开始字段,则处理粘包情况。如果字节数组前两个字节与预定义的启动帧命令一致,则设置帧长度为启动帧的长度。否则,设置帧长度为字节数组中指定位置的数据长度加3。
以上就是这段代码的主要逻辑。
阅读全文