Jtt1078MessageDecoder.java 2.32 KB
package cn.org.hentai.jtt1078.server;

import cn.org.hentai.jtt1078.util.ByteUtils;
import cn.org.hentai.jtt1078.util.Packet;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * Created by matrixy on 2019/4/9.
 */
public class Jtt1078MessageDecoder extends ByteToMessageDecoder
{
    static Logger logger = LoggerFactory.getLogger(Jtt1078MessageDecoder.class);
    byte[] block = new byte[4096];
    Jtt1078Decoder decoder = new Jtt1078Decoder();

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception
    {
        int length = in.readableBytes();
        while (length > 30) {
            in.markReaderIndex();
            int frameHeader = in.readInt();
            if (frameHeader == 0x30316364) {
                in.skipBytes(11);
                int dataType = (in.readByte() >> 4) & 0xFF, lengthOffset = 28;
                // 透传数据类型:0100,没有后面的时间以及Last I Frame Interval和Last Frame Interval字段
                if (dataType == 0x04) lengthOffset = 28 - 8 - 2 - 2;
                else if (dataType == 0x03) lengthOffset = 28 - 4;
                in.skipBytes(lengthOffset - 16);
                int bodyLength = in.readShort() & 0xFFFFFFFF;
                int packetLength = lengthOffset + bodyLength + 2;
                //System.out.println(bodyLength);
                if (length < packetLength) {
                    in.resetReaderIndex();
                    return;
                }
                byte[] data = new byte[packetLength];
                in.resetReaderIndex();
                in.readBytes(data);
                Packet packet = Packet.create(data);
                out.add(packet);
//                System.out.println("start:" + (lengthOffset + 2));
//                System.out.println(toHex(data));
            } else {
                in.resetReaderIndex();
                in.readByte();
            }

            length = in.readableBytes();
        }
    }

    public String toHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X ", b));
        }

        return sb.toString();
    }
}