Example #1
0
        private string ReadPString(FieldInfo Info)
        {
            if (Info != null)
            {
                string Type          = Tools.GetAttributePropertyValue(Info, Const.PSTRING, "PrefixType");
                bool   UnicodeLength = Tools.GetAttributePropertyValue(Info, Const.PSTRING, "UnicodeLength");
                long   Len           = ReadValueByType(Type);

                if (UnicodeLength)
                {
                    Len *= 2;
                }

                if (Len > BaseStream.Length - BaseStream.Position)
                {
                    throw new Exception("Invalid Length");
                }

                byte[] Buff = new byte[Len];
                while (Len > 0)
                {
                    Len -= BaseStream.Read(Buff, 0, Len > int.MaxValue ? int.MaxValue : (int)Len);
                }
                return(Encoding.GetString(Buff));
            }
            else
            {
                return(ReadString());
            }
        }
        internal void WriteField(dynamic Value, string Type, FieldInfo field, ref object Instance)
        {
            switch (Type)
            {
            case Const.STRING:
                if (HasAttribute(field, Const.CSTRING))
                {
                    Write(Value, StringStyle.CString);
                    break;
                }
                if (HasAttribute(field, Const.UCSTRING))
                {
                    Write(Value, StringStyle.UCString);
                    break;
                }
                if (HasAttribute(field, Const.PSTRING))
                {
                    Write(field, Value, StringStyle.PString);
                    break;
                }
                if (HasAttribute(field, Const.FSTRING))
                {
                    byte[] Buffer = new byte[Tools.GetAttributePropertyValue(field, Const.FSTRING, "Length")];
                    Encoding.GetBytes((string)Value).CopyTo(Buffer, 0);
                    Write(Buffer);
                    break;
                }
                throw new Exception("String Attribute Not Specified.");

            default:
                if (HasAttribute(field, Const.STRUCT))
                {
                    WriteStruct(System.Type.GetType(Type), ref Value);
                }
                else
                {
                    if (field.FieldType.BaseType.ToString() == Const.DELEGATE)
                    {
                        FieldInvoke Invoker = ((FieldInvoke)Value);
                        if (Invoker == null)
                        {
                            break;
                        }
                        Instance = Invoker.Invoke(BaseStream, false, Instance);
                        field.SetValue(Instance, Invoker);
                    }
                    else if (BigEndian)
                    {
                        Write(Tools.Reverse(Value));
                    }
                    else
                    {
                        Write(Value);
                    }
                }
                break;
            }
        }
        internal void ReadStruct(Type type, ref object Instance)
        {
            FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            for (int i = 0; i < fields.Length; i++)
            {
                FieldInfo field = fields[i];
                if (Tools.HasAttribute(field, Const.IGNORE))
                {
                    continue;
                }

                string  FType = field.FieldType.ToString();
                dynamic Value = null;

                if (!FType.EndsWith("[]"))
                {
                    Value = ReadField(FType, field, ref Instance);
                }
                else
                {
                    if (Tools.HasAttribute(field, Const.FARRAY))
                    {
                        byte[] Buffer = new byte[Tools.GetAttributePropertyValue(field, Const.FARRAY, "Length")];

                        if (Read(Buffer, 0, Buffer.Length) != Buffer.Length)
                        {
                            throw new Exception("Failed to Read");
                        }

                        Value = Buffer;
                    }
                    else if (Tools.HasAttribute(field, Const.PARRAY))
                    {
                        FType = FType.Substring(0, FType.Length - 2);

                        string  PType = Tools.GetAttributePropertyValue(field, Const.PARRAY, "PrefixType");
                        dynamic Count = ReadField(PType, field, ref Instance);


                        object[] Content = new object[Count];
                        for (long x = 0; x < Count; x++)
                        {
                            Content[x] = ReadField(FType, field, ref Instance);
                        }


                        Value = Array.CreateInstance(Type.GetType(FType), Count);
                        Content.CopyTo(Value, 0);
                    }
                    else
                    {
                        throw new Exception("Bad Struct Configuration");
                    }
                }

                field.SetValue(Instance, Value);
            }
        }
        internal void ReadStruct(Type type, ref object Instance)
        {
            FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            for (int i = 0; i < fields.Length; i++)
            {
                FieldInfo field = fields[i];
                if (Tools.HasAttribute(field, Const.IGNORE))
                {
                    continue;
                }

                string  FType = field.FieldType.ToString();
                dynamic Value = null;

                if (!FType.EndsWith("[]"))
                {
                    Value = ReadField(FType, field, ref Instance);
                }
                else
                {
                    dynamic Count = null;
                    if (Tools.HasAttribute(field, Const.FARRAY))
                    {
                        Count = Tools.GetAttributePropertyValue(field, Const.FARRAY, "Length");
                    }
                    else if (Tools.HasAttribute(field, Const.PARRAY))
                    {
                        string PType = Tools.GetAttributePropertyValue(field, Const.PARRAY, "PrefixType");
                        Count = ReadField(PType, field, ref Instance);
                    }
                    else if (Tools.HasAttribute(field, Const.RARRAY))
                    {
                        string    PFieldName  = Tools.GetAttributePropertyValue(field, Const.RARRAY, "FieldName");
                        FieldInfo PrefixField = (from x in fields where x.Name == PFieldName select x).First();
                        Count = PrefixField.GetValue(Instance);
                    }
                    else
                    {
                        throw new Exception("Bad Struct Array Configuration");
                    }

                    FType = FType.Substring(0, FType.Length - 2);

                    object[] Content = new object[Count];
                    for (long x = 0; x < Count; x++)
                    {
                        Content[x] = ReadField(FType, field, ref Instance);
                    }


                    Value = Array.CreateInstance(Type.GetType(FType), Count);
                    Content.CopyTo(Value, 0);
                }

                field.SetValue(Instance, Value);
            }
        }
        internal void WriteStruct(Type type, ref object Instance)
        {
            FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            foreach (FieldInfo field in fields)
            {
                if (HasAttribute(field, Const.IGNORE))
                {
                    continue;
                }
                dynamic Value = field.GetValue(Instance);
                string  Type  = field.FieldType.ToString();
                if (!Type.EndsWith("[]"))
                {
                    WriteField(Value, Type, field, ref Instance);
                    continue;
                }
                if (HasAttribute(field, Const.FARRAY))
                {
                    long BufferLen = Tools.GetAttributePropertyValue(field, Const.FARRAY, "Length");

                    if (Value.Length > BufferLen)
                    {
                        throw new Exception("Wrong Array Buffer Length");
                    }

                    byte[] Arr = new byte[BufferLen];
                    Value.CopyTo(Arr, 0);

                    Write(Arr);
                    continue;
                }

                if (!HasAttribute(field, Const.PARRAY))
                {
                    throw new Exception("Bad Struct Array Configuration.");
                }

                string  PType  = Tools.GetAttributePropertyValue(field, Const.PARRAY, "PrefixType");
                dynamic Length = ParseType(Value.LongLength, PType);

                if (BigEndian)
                {
                    Length = Tools.Reverse(Length);
                }
                Write(Length);

                System.Collections.IEnumerator Enum = Value.GetEnumerator();
                for (long i = 0; i < Length; i++)
                {
                    Enum.MoveNext();
                    WriteField(Enum.Current, Type.Substring(0, Type.Length - 2), field, ref Instance);
                }
            }
        }
        public string ReadString(StringStyle Style, FieldInfo Info = null)
        {
            List <byte> Buffer = new List <byte>();

            switch (Style)
            {
            case StringStyle.CString:
                while (true)
                {
                    byte Byte = base.ReadByte();
                    if (Byte < 1)
                    {
                        break;
                    }
                    Buffer.Add(Byte);
                }
                return(Encoding.GetString(Buffer.ToArray()));

            case StringStyle.UCString:
                while (true)
                {
                    byte Byte1 = base.ReadByte();
                    byte Byte2 = base.ReadByte();
                    if (Byte1 == 0x00 && Byte2 == 0x00)
                    {
                        break;
                    }
                    Buffer.Add(Byte1);
                    Buffer.Add(Byte2);
                }
                return(Encoding.GetString(Buffer.ToArray()));

            case StringStyle.PString:
                if (Info != null)
                {
                    long   Len;
                    string Prefix        = Tools.GetAttributePropertyValue(Info, Const.PSTRING, "PrefixType");
                    bool   UnicodeLength = Tools.GetAttributePropertyValue(Info, Const.PSTRING, "UnicodeLength");
                    switch (Prefix)
                    {
                    case Const.INT16:
                        if (BigEndian)
                        {
                            Len = Tools.Reverse(ReadInt16());
                        }
                        else
                        {
                            Len = ReadInt16();
                        }
                        break;

                    case Const.UINT16:
                        if (BigEndian)
                        {
                            Len = Tools.Reverse(ReadUInt16());
                        }
                        else
                        {
                            Len = ReadUInt16();
                        }
                        break;

                    case Const.UINT8:
                        if (BigEndian)
                        {
                            Len = Tools.Reverse(ReadByte());
                        }
                        else
                        {
                            Len = ReadByte();
                        }
                        break;

                    case Const.INT8:
                        if (BigEndian)
                        {
                            Len = Tools.Reverse(ReadSByte());
                        }
                        else
                        {
                            Len = ReadSByte();
                        }
                        break;

                    case Const.INT32:
                        if (BigEndian)
                        {
                            Len = Tools.Reverse(ReadInt32());
                        }
                        else
                        {
                            Len = ReadInt32();
                        }
                        break;

                    case Const.UINT32:
                        if (BigEndian)
                        {
                            Len = Tools.Reverse(ReadUInt32());
                        }
                        else
                        {
                            Len = ReadUInt32();
                        }
                        break;

                    case Const.INT64:
                        if (BigEndian)
                        {
                            Len = Tools.Reverse(ReadInt64());
                        }
                        else
                        {
                            Len = ReadInt64();
                        }
                        break;

                    default:
                        throw new Exception("Invalid Data Type");
                    }
                    if (UnicodeLength)
                    {
                        Len *= 2;
                    }
                    if (Len > BaseStream.Length - BaseStream.Position)
                    {
                        throw new Exception("Invalid Length");
                    }
                    byte[] Buff = new byte[Len];
                    while (Len > 0)
                    {
                        Len -= BaseStream.Read(Buff, 0, Len > int.MaxValue ? int.MaxValue : (int)Len);
                    }
                    return(Encoding.GetString(Buff));
                }
                else
                {
                    return(ReadString());
                }

            default:
                throw new Exception("Unk Value Type");
            }
        }
        private void ReadStruct(Type type, ref object Instance)
        {
            FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            for (int i = 0; i < fields.Length; i++)
            {
                FieldInfo field = fields[i];
                if (Tools.HasAttribute(field, Const.IGNORE))
                {
                    continue;
                }
                dynamic Value    = null;
                bool    IsNumber = true;
                switch (field.FieldType.ToString())
                {
                case Const.INT8:
                    Value = base.ReadSByte();
                    break;

                case Const.INT16:
                    Value = base.ReadInt16();
                    break;

                case Const.UINT16:
                    Value = base.ReadUInt16();
                    break;

                case Const.UINT8:
                    Value = base.ReadByte();
                    break;

                case Const.INT32:
                    Value = base.ReadInt32();
                    break;

                case Const.UINT32:
                    Value = base.ReadUInt32();
                    break;

                case Const.DOUBLE:
                    Value = base.ReadDouble();
                    break;

                case Const.FLOAT:
                    Value = base.ReadSingle();
                    break;

                case Const.INT64:
                    Value = base.ReadInt64();
                    break;

                case Const.UINT64:
                    Value = base.ReadUInt64();
                    break;

                case Const.STRING:
                    IsNumber = false;
                    if (Tools.HasAttribute(field, Const.CSTRING) && Tools.HasAttribute(field, Const.PSTRING))
                    {
                        throw new Exception("You can't use CString and PString Attribute into the same field.");
                    }
                    if (Tools.HasAttribute(field, Const.CSTRING))
                    {
                        Value = ReadString(StringStyle.CString);
                        break;
                    }
                    if (Tools.HasAttribute(field, Const.UCSTRING))
                    {
                        Value = ReadString(StringStyle.UCString);
                        break;
                    }
                    if (Tools.HasAttribute(field, Const.PSTRING))
                    {
                        Value = ReadString(StringStyle.PString, field);
                        break;
                    }
                    if (Tools.HasAttribute(field, Const.FSTRING))
                    {
                        byte[] Bffr = new byte[Tools.GetAttributePropertyValue(field, Const.FSTRING, "Length")];
                        if (Read(Bffr, 0, Bffr.Length) != Bffr.Length)
                        {
                            throw new Exception("Failed to Read a String");
                        }
                        Value = Encoding.GetString(Bffr);
                        break;
                    }
                    throw new Exception("String Attribute Not Specified.");

                case Const.BYTEARR:
                    byte[] Buffer = new byte[Tools.GetAttributePropertyValue(field, Const.ArrSize, "Length")];
                    if (Read(Buffer, 0, Buffer.Length) != Buffer.Length)
                    {
                        throw new Exception("Failed to Read");
                    }
                    Value = Buffer;
                    break;

                default:
                    IsNumber = false;
                    if (Tools.HasAttribute(field, Const.STRUCT))
                    {
                        Value = Activator.CreateInstance(field.FieldType);
                        ReadStruct(field.FieldType, ref Value);
                    }
                    else
                    {
                        if (field.FieldType.BaseType.ToString() == Const.DELEGATE)
                        {
                            FieldInvoke Invoker = (FieldInvoke)field.GetValue(Instance);
                            Value = Invoker;
                            if (Invoker == null)
                            {
                                break;
                            }
                            Instance = Invoker.Invoke(BaseStream, true, Instance);
                            break;
                        }
                        throw new Exception("Unk Struct Field: " + field.FieldType.ToString());
                    }
                    break;
                }
                if (IsNumber && BigEndian)
                {
                    Value = Tools.Reverse(Value);
                }
                field.SetValue(Instance, Value);
            }
        }
        private void WritePString(FieldInfo Field, dynamic Value)
        {
            byte[] Arr = Encoding.GetBytes(Value);

            string Prefix        = Tools.GetAttributePropertyValue(Field, Const.PSTRING, "PrefixType");
            bool   UnicodeLength = Tools.GetAttributePropertyValue(Field, Const.PSTRING, "UnicodeLength");


            long Length = Arr.LongLength;

            if (UnicodeLength)
            {
                Length /= 2;
            }

            switch (Prefix)
            {
            case Const.INT16:
                if (BigEndian)
                {
                    base.Write((short)Tools.Reverse((short)Length));
                }
                else
                {
                    base.Write((short)Length);
                }
                break;

            case Const.UINT16:
                if (BigEndian)
                {
                    base.Write((ushort)Tools.Reverse((ushort)Length));
                }
                else
                {
                    base.Write((ushort)Length);
                }
                break;

            case Const.UINT8:
                if (BigEndian)
                {
                    base.Write((byte)Tools.Reverse((byte)Length));
                }
                else
                {
                    base.Write((byte)Length);
                }
                break;

            case Const.INT8:
                if (BigEndian)
                {
                    base.Write((sbyte)Tools.Reverse((sbyte)Length));
                }
                else
                {
                    base.Write((sbyte)Length);
                }
                break;

            case Const.INT32:
                if (BigEndian)
                {
                    base.Write((int)Tools.Reverse((int)Length));
                }
                else
                {
                    base.Write((int)Length);
                }
                break;

            case Const.UINT32:
                if (BigEndian)
                {
                    base.Write((uint)Tools.Reverse((uint)Length));
                }
                else
                {
                    base.Write((uint)Length);
                }
                break;

            case Const.INT64:
                if (BigEndian)
                {
                    base.Write((long)Tools.Reverse(Length));
                }
                else
                {
                    base.Write(Length);
                }
                break;

            default:
                throw new Exception("Invalid Data Type");
            }
            base.Write(Arr);
        }
        private void WriteStruct(Type type, ref object Instance)
        {
            FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            foreach (FieldInfo field in fields)
            {
                if (HasAttribute(field, Const.IGNORE))
                {
                    break;
                }
                dynamic Value = field.GetValue(Instance);
                switch (field.FieldType.ToString())
                {
                case Const.STRING:
                    if (HasAttribute(field, Const.CSTRING))
                    {
                        Write(Value, StringStyle.CString);
                        break;
                    }
                    if (HasAttribute(field, Const.UCSTRING))
                    {
                        Write(Value, StringStyle.UCString);
                        break;
                    }
                    if (HasAttribute(field, Const.PSTRING))
                    {
                        Write(field, Value, StringStyle.PString);
                        break;
                    }
                    if (HasAttribute(field, Const.FSTRING))
                    {
                        byte[] Buffer = new byte[Tools.GetAttributePropertyValue(field, Const.FSTRING, "Length")];
                        Encoding.GetBytes((string)Value).CopyTo(Buffer, 0);
                        Write(Buffer);
                        break;
                    }
                    throw new Exception("String Attribute Not Specified.");

                case Const.BYTEARR:
                    if (HasAttribute(field, Const.ArrSize))
                    {
                        long BufferLen = Tools.GetAttributePropertyValue(field, Const.ArrSize, "Length");
                        if (Value.Length > BufferLen)
                        {
                            throw new Exception("Wrong Array Buffer Length");
                        }
                        byte[] Arr = new byte[BufferLen];
                        Value.CopyTo(Arr, 0);

                        Write(Arr);
                    }
                    else
                    {
                        throw new Exception("The Array don't have the length specified");
                    }
                    break;

                default:
                    if (HasAttribute(field, Const.STRUCT))
                    {
                        WriteStruct(field.FieldType, ref Value);
                    }
                    else
                    {
                        if (field.FieldType.BaseType.ToString() == Const.DELEGATE)
                        {
                            FieldInvoke Invoker = ((FieldInvoke)Value);
                            if (Invoker == null)
                            {
                                break;
                            }
                            Instance = Invoker.Invoke(BaseStream, false, Instance);
                            field.SetValue(Instance, Invoker);
                        }
                        else if (BigEndian)
                        {
                            Write(Tools.Reverse(Value));
                        }
                        else
                        {
                            Write(Value);
                        }
                    }
                    break;
                }
            }
        }
        internal dynamic ReadField(string Type, FieldInfo field, ref object Instance)
        {
            bool    IsNumber = true;
            dynamic Value    = null;

            switch (Type)
            {
            case Const.INT8:
                Value = base.ReadSByte();
                break;

            case Const.INT16:
                Value = base.ReadInt16();
                break;

            case Const.CHAR:
                Value = base.ReadChar();
                break;

            case Const.UINT16:
                Value = base.ReadUInt16();
                break;

            case Const.UINT8:
                Value = base.ReadByte();
                break;

            case Const.INT32:
                Value = base.ReadInt32();
                break;

            case Const.UINT32:
                Value = base.ReadUInt32();
                break;

            case Const.DOUBLE:
                Value = base.ReadDouble();
                break;

            case Const.FLOAT:
                Value = base.ReadSingle();
                break;

            case Const.INT64:
                Value = base.ReadInt64();
                break;

            case Const.UINT64:
                Value = base.ReadUInt64();
                break;

            case Const.STRING:
                IsNumber = false;
                if (Tools.HasAttribute(field, Const.CSTRING) && Tools.HasAttribute(field, Const.PSTRING))
                {
                    throw new Exception("You can't use CString and PString Attribute into the same field.");
                }
                if (Tools.HasAttribute(field, Const.CSTRING))
                {
                    Value = ReadString(StringStyle.CString);
                    break;
                }
                if (Tools.HasAttribute(field, Const.UCSTRING))
                {
                    Value = ReadString(StringStyle.UCString);
                    break;
                }
                if (Tools.HasAttribute(field, Const.PSTRING))
                {
                    Value = ReadString(StringStyle.PString, field);
                    break;
                }
                if (Tools.HasAttribute(field, Const.FSTRING))
                {
                    byte[] Bffr = new byte[Tools.GetAttributePropertyValue(field, Const.FSTRING, "Length")];
                    if (Read(Bffr, 0, Bffr.Length) != Bffr.Length)
                    {
                        throw new Exception("Failed to Read a String");
                    }
                    bool TrimEnd = Tools.GetAttributePropertyValue(field, Const.FSTRING, "TrimNull");
                    Value = TrimEnd ? Encoding.GetString(Bffr).TrimEnd('\x0') : Encoding.GetString(Bffr);
                    break;
                }
                throw new Exception("String Attribute Not Specified.");

            default:
                IsNumber = false;
                if (Tools.HasAttribute(field, Const.STRUCT))
                {
                    Type FieldType = System.Type.GetType(Type);
                    Value = Activator.CreateInstance(FieldType);
                    ReadStruct(FieldType, ref Value);
                }
                else
                {
                    if (field.FieldType.BaseType.ToString() == Const.DELEGATE)
                    {
                        FieldInvoke Invoker = (FieldInvoke)field.GetValue(Instance);
                        Value = Invoker;
                        if (Invoker == null)
                        {
                            break;
                        }
                        Instance = Invoker.Invoke(BaseStream, true, Instance);
                        break;
                    }
                    throw new Exception("Unk Struct Field: " + field.FieldType.ToString());
                }
                break;
            }
            if (IsNumber && BigEndian)
            {
                Value = Tools.Reverse(Value);
            }
            return(Value);
        }
        internal void WriteStruct(Type type, ref object Instance)
        {
            FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

            foreach (FieldInfo field in fields)
            {
                if (HasAttribute(field, Const.IGNORE) || !HasAttribute(field, Const.RARRAY))
                {
                    continue;
                }

                dynamic   Value       = field.GetValue(Instance);
                string    PFieldName  = Tools.GetAttributePropertyValue(field, Const.RARRAY, "FieldName");
                FieldInfo PrefixField = (from x in fields where x.Name == PFieldName select x).First();
                PrefixField.SetValue(Instance, ParseType(Value.LongLength, PrefixField.FieldType.FullName));
            }

            foreach (FieldInfo field in fields)
            {
                if (HasAttribute(field, Const.IGNORE))
                {
                    continue;
                }
                dynamic Value = field.GetValue(Instance);
                string  Type  = field.FieldType.ToString();
                if (!Type.EndsWith("[]"))
                {
                    WriteField(Value, Type, field, ref Instance);
                    continue;
                }

                if (HasAttribute(field, Const.FARRAY))
                {
                    long Length = Tools.GetAttributePropertyValue(field, Const.FARRAY, "Length");

                    if (Value.LongLength > Length)
                    {
                        throw new Exception("Wrong Array Buffer Length");
                    }
                }
                else if (HasAttribute(field, Const.PARRAY))
                {
                    string  PType  = Tools.GetAttributePropertyValue(field, Const.PARRAY, "PrefixType");
                    dynamic Length = ParseType(Value.LongLength, PType);

                    if (BigEndian)
                    {
                        Length = Tools.Reverse(Length);
                    }
                    Write(Length);
                }
                else if (!HasAttribute(field, Const.RARRAY))
                {
                    throw new Exception("Bad Struct Array Configuration");
                }

                string      RealType = Type.Substring(0, Type.Length - 2);
                IEnumerator Enum     = Value.GetEnumerator();
                for (long i = 0; i < Value.LongLength; i++)
                {
                    Enum.MoveNext();
                    WriteField(Enum.Current, RealType, field, ref Instance);
                }
            }
        }
        public void Write(FieldInfo Field, dynamic Value, StringStyle Style)
        {
            switch (Style)
            {
            case StringStyle.UCString:
            case StringStyle.CString:
                List <byte> Buffer = new List <byte>(Encoding.GetBytes(Value + "\x0"));
                base.Write(Buffer.ToArray(), 0, Buffer.Count);
                break;

            case StringStyle.PString:
                byte[] Arr = Encoding.GetBytes(Value);

                string Prefix        = Tools.GetAttributePropertyValue(Field, Const.PSTRING, "PrefixType");
                bool   UnicodeLength = Tools.GetAttributePropertyValue(Field, Const.PSTRING, "UnicodeLength");


                long Length = Arr.LongLength;
                if (UnicodeLength)
                {
                    Length /= 2;
                }

                switch (Prefix)
                {
                case Const.INT16:
                    if (BigEndian)
                    {
                        base.Write((short)Tools.Reverse((short)Length));
                    }
                    else
                    {
                        base.Write((short)Length);
                    }
                    break;

                case Const.UINT16:
                    if (BigEndian)
                    {
                        base.Write((ushort)Tools.Reverse((ushort)Length));
                    }
                    else
                    {
                        base.Write((ushort)Length);
                    }
                    break;

                case Const.UINT8:
                    if (BigEndian)
                    {
                        base.Write((byte)Tools.Reverse((byte)Length));
                    }
                    else
                    {
                        base.Write((byte)Length);
                    }
                    break;

                case Const.INT8:
                    if (BigEndian)
                    {
                        base.Write((sbyte)Tools.Reverse((sbyte)Length));
                    }
                    else
                    {
                        base.Write((sbyte)Length);
                    }
                    break;

                case Const.INT32:
                    if (BigEndian)
                    {
                        base.Write((int)Tools.Reverse((int)Length));
                    }
                    else
                    {
                        base.Write((int)Length);
                    }
                    break;

                case Const.UINT32:
                    if (BigEndian)
                    {
                        base.Write((uint)Tools.Reverse((uint)Length));
                    }
                    else
                    {
                        base.Write((uint)Length);
                    }
                    break;

                case Const.INT64:
                    if (BigEndian)
                    {
                        base.Write((long)Tools.Reverse(Length));
                    }
                    else
                    {
                        base.Write(Length);
                    }
                    break;

                default:
                    throw new Exception("Invalid Data Type");
                }
                base.Write(Arr);
                break;
            }
        }