Ejemplo n.º 1
0
        /// <summary>
        /// 将消息按JT/T 808协议进行编码为字节数组
        /// </summary>
        /// <returns></returns>
        public byte[] Encode()
        {
            if (MsgHeader == null)
            {
                throw new Exception("Field: msgHead cannot be null.");
            }

            // 消息头编码
            byte[] msgHeadBytes = MsgHeader.Encode();

            // body
            byte[] msgBodyBytes = null;
            if (MsgBody != null)
            {
                msgBodyBytes = MsgBody;
            }

            // 构建消息(不包含校验码和头尾标识)
            byte[] message = null;
            if (msgBodyBytes != null)
            {
                ByteBuffer msgbuf = ByteBuffer.Allocate(
                    msgHeadBytes.Length + msgBodyBytes.Length);
                msgbuf.Put(msgHeadBytes);
                msgbuf.Put(msgBodyBytes);
                message = msgbuf.Array();
            }
            else
            {
                message = msgHeadBytes;
            }

            // 计算校验码
            byte       checkCode     = JT808ProtoDecoder.CheckCode(message);
            ByteBuffer checkedBuffer = ByteBuffer.Allocate(message.Length + 1);

            checkedBuffer.Put(message);
            checkedBuffer.Put(checkCode);
            byte[] checkedMessage = checkedBuffer.Array();

            // 转义
            byte[] escapedMessage = JT808ProtoDecoder.Escape(checkedMessage);

            // 增加标识位
            ByteBuffer buffer = ByteBuffer.Allocate(escapedMessage.Length + 2);

            buffer.Put(JT808Constant.PKG_DELIMITER);
            buffer.Put(escapedMessage);
            buffer.Put(JT808Constant.PKG_DELIMITER);

            return(buffer.Array());
        }