修正命名错误
xiyunfei authored at 2023-04-09 21:10:58
2.88 KiB
NewLife.JT808
using NewLife;
using NewLife.Data;
using NewLife.Log;
using NewLife.Serialization;

namespace NewLife.JT808.SuBiao
{
    /// <summary>文件信息</summary>
    public class FileMessage : IAccessor
    {
        #region 属性
        /// <summary>文件名称</summary>
        [FieldSize(50)]
        public String FileName { get; set; }

        /// <summary>偏移量</summary>
        public Int32 Offset { get; set; }

        /// <summary>负载数据长度</summary>
        public Int32 Length { get; set; }

        /// <summary>负载数据。默认长度64k,小于64k则为实际长度</summary>
        public Byte[] Payload { get; set; }
        #endregion

        #region 读写
        /// <summary>解析数据流</summary>
        /// <param name="stream"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public Boolean Read(Stream stream, Object? context)
        {
            if (stream == null && context == null) return false;

            // 头部标识探测
            var magic = stream.ReadBytes(4).ToStr();
            if (magic != "00cd") return false;

            var reader = new Binary { Stream = stream, IsLittleEndian = false };

            FileName = reader.ReadFixedString(50);
            Offset = reader.ReadInt32();
            Length = reader.ReadInt32();

            var len = reader.ReadInt32();
            if (len > 0) Payload = reader.ReadBytes(len);

            return true;
        }

        /// <summary>写入数据</summary>
        /// <param name="stream"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public Boolean Write(Stream stream, Object? context)
        {
            if (stream == null && context == null) return false;

            var writer = new Binary { Stream = stream, IsLittleEndian = false };

            writer.Write("00cd".GetBytes());

            writer.WriteFixedString(FileName, 50);
            writer.Write(Offset);
            writer.Write(Length);

            var len = Payload?.Length ?? 0;
            writer.Write(len);
            if (len > 0) writer.Write(Payload);

            return true;
        }

        /// <summary>读取数据包</summary>
        /// <param name="pk"></param>
        /// <returns></returns>
        public Boolean Read(IPacket pk) => Read(pk.GetStream(), null);

        /// <summary>转数据包</summary>
        /// <returns></returns>
        public IPacket ToPacket()
        {
            try
            {
                var ms = new MemoryStream();
                if (!Write(ms, null)) return null;

                ms.Position = 0;
                return new ArrayPacket(ms);
            }
            catch (Exception ex)
            {
                XTrace.WriteException(ex);
                throw;
            }
        }
        #endregion
    }
}