コード例 #1
0
 public BinaryBooleanSizeAttribute(BooleanSize Size)
 {
     this.Size = Size;
 }
コード例 #2
0
        public void ReadObject(Object obj)
        {
            Type t = obj.GetType();

            MemberInfo[] m = t.FindMembers(MemberTypes.Field | MemberTypes.Property, BindingFlags.Instance | BindingFlags.Public, null, null);
            foreach (MemberInfo f in m)
            {
                Type FieldType;
                if (f.MemberType == MemberTypes.Property)
                {
                    FieldType = ((PropertyInfo)f).PropertyType;
                }
                else
                {
                    FieldType = ((FieldInfo)f).FieldType;
                }
                if (GetAttributeValue <bool>(f, typeof(BinaryIgnoreAttribute), false))
                {
                    continue;
                }
                if (f.GetCustomAttributes(typeof(BinaryBOMAttribute), true).Length != 0)
                {
                    Endianness = IO.Endianness.BigEndian;
                }
                object Result;
                if (FieldType.IsArray)
                {
                    int ArraySize = GetAttributeValue <int>(f, typeof(BinaryFixedSizeAttribute), 0);
                    if (ArraySize <= 0)
                    {
                        throw new ArgumentException("Array size must be greater than 0!");
                    }
                    if (FieldType.GetElementType().IsPrimitive)
                    {
                        switch (FieldType.GetElementType().Name)
                        {
                        case "Boolean":
                        {
                            BooleanSize b = GetAttributeValue <BooleanSize>(f, typeof(BinaryBooleanSizeAttribute), BooleanSize.U32);
                            Result = new Boolean[ArraySize];
                            switch (b)
                            {
                            case BooleanSize.U8:
                                for (int i = 0; i < ArraySize; i++)
                                {
                                    ((Boolean[])Result)[i] = ReadByte() == 1;
                                }
                                break;

                            case BooleanSize.U16:
                                for (int i = 0; i < ArraySize; i++)
                                {
                                    ((Boolean[])Result)[i] = ReadUInt16() == 1;
                                }
                                break;

                            case BooleanSize.U32:
                                for (int i = 0; i < ArraySize; i++)
                                {
                                    ((Boolean[])Result)[i] = ReadUInt32() == 1;
                                }
                                break;

                            default: throw new Exception("Invalid BooleanSize Value!");
                            }
                            break;
                        }

                        case "Byte": Result = ReadBytes(ArraySize); break;

                        case "SByte": Result = ReadSBytes(ArraySize); break;

                        case "Int16": Result = ReadInt16s(ArraySize); break;

                        case "UInt16": Result = ReadUInt16s(ArraySize); break;

                        case "Int32": Result = ReadInt32s(ArraySize); break;

                        case "UInt32": Result = ReadUInt32s(ArraySize); break;

                        case "Int64": Result = ReadInt64s(ArraySize); break;

                        case "UInt64": Result = ReadUInt64s(ArraySize); break;

                        //Unsupported
                        case "IntPtr":
                        case "UIntPtr":
                            goto default;

                        case "Char": Result = ReadChars(GetAttributeValue <Encoding>(f, typeof(BinaryStringEncodingAttribute), Encoding.ASCII), ArraySize); break;

                        case "Double": Result = ReadDoubles(ArraySize); break;

                        case "Single":
                        {
                            uint Format = GetAttributeValue <uint>(f, typeof(BinaryFixedPointAttribute), 0);
                            if (Format == 0)
                            {
                                Result = ReadSingles(ArraySize);
                            }
                            else
                            {
                                bool Sign     = (Format >> 14) == 1;
                                int  IntPart  = (int)((Format >> 7) & 0x7F);
                                int  FracPart = (int)(Format & 0x7F);
                                Result = new Single[ArraySize];
                                for (int i = 0; i < ArraySize; i++)
                                {
                                    ((Single[])Result)[i] = ReadFixedPoint(Sign, IntPart, FracPart);
                                }
                            }
                            break;
                        }

                        default:
                            throw new Exception(t.Name + " is not supported!");
                        }
                    }
                    else
                    {
                        Type elementt = FieldType.GetElementType();
                        Result = Array.CreateInstance(elementt, ArraySize);
                        for (int i = 0; i < ArraySize; i++)
                        {
                            ((Array)Result).SetValue(elementt.InvokeMember("", BindingFlags.CreateInstance, null, null, new object[] { this }), i);
                        }
                    }
                }
                else
                {
                    if (FieldType.IsEnum)
                    {
                        FieldType = FieldType.GetEnumUnderlyingType();
                    }
                    if (FieldType.IsPrimitive)
                    {
                        switch (FieldType.Name)
                        {
                        case "Boolean":
                        {
                            BooleanSize b = GetAttributeValue <BooleanSize>(f, typeof(BinaryBooleanSizeAttribute), BooleanSize.U32);
                            switch (b)
                            {
                            case BooleanSize.U8: Result = ReadByte() == 1; break;

                            case BooleanSize.U16: Result = ReadUInt16() == 1; break;

                            case BooleanSize.U32: Result = ReadUInt32() == 1; break;

                            default: throw new Exception("Invalid BooleanSize Value!");
                            }
                            break;
                        }

                        case "Byte": Result = ReadByte(); break;

                        case "SByte": Result = ReadSByte(); break;

                        case "Int16": Result = ReadInt16(); break;

                        case "UInt16": Result = ReadUInt16(); break;

                        case "Int32": Result = ReadInt32(); break;

                        case "UInt32": Result = ReadUInt32(); break;

                        case "Int64": Result = ReadInt64(); break;

                        case "UInt64": Result = ReadUInt64(); break;

                        //Unsupported
                        case "IntPtr":
                        case "UIntPtr":
                            goto default;

                        case "Char": Result = ReadChar(GetAttributeValue <Encoding>(f, typeof(BinaryStringEncodingAttribute), Encoding.ASCII)); break;

                        case "Double": Result = ReadDouble(); break;

                        case "Single":
                        {
                            uint Format = GetAttributeValue <uint>(f, typeof(BinaryFixedPointAttribute), 0);
                            if (Format == 0)
                            {
                                Result = ReadSingle();
                            }
                            else
                            {
                                bool Sign     = (Format >> 14) == 1;
                                int  IntPart  = (int)((Format >> 7) & 0x7F);
                                int  FracPart = (int)(Format & 0x7F);
                                Result = ReadFixedPoint(Sign, IntPart, FracPart);
                            }
                            break;
                        }

                        default:
                            throw new Exception(t.Name + " is not supported!");
                        }
                    }
                    else if (FieldType.Name == "String")
                    {
                        if (GetAttributeValue <bool>(f, typeof(BinaryStringNTAttribute), false))
                        {
                            Result = ReadStringNT(GetAttributeValue <Encoding>(f, typeof(BinaryStringEncodingAttribute), Encoding.ASCII));
                        }
                        else
                        {
                            int length = GetAttributeValue <int>(f, typeof(BinaryFixedSizeAttribute), 0);
                            if (length <= 0)
                            {
                                throw new ArgumentException("String size must be greater than 0!");
                            }
                            Result = ReadString(GetAttributeValue <Encoding>(f, typeof(BinaryStringEncodingAttribute), Encoding.ASCII), length);
                        }
                    }
                    else if (FieldType.Name == "Vector2")
                    {
                        uint Format = GetAttributeValue <uint>(f, typeof(BinaryFixedPointAttribute), 0);
                        if (Format == 0)
                        {
                            Result = ReadVector2();
                        }
                        else
                        {
                            bool Sign     = (Format >> 14) == 1;
                            int  IntPart  = (int)((Format >> 7) & 0x7F);
                            int  FracPart = (int)(Format & 0x7F);
                            Result = new Vector2(ReadFixedPoint(Sign, IntPart, FracPart), ReadFixedPoint(Sign, IntPart, FracPart));
                        }
                    }
                    else if (FieldType.Name == "Vector3")
                    {
                        uint Format = GetAttributeValue <uint>(f, typeof(BinaryFixedPointAttribute), 0);
                        if (Format == 0)
                        {
                            Result = ReadVector3();
                        }
                        else
                        {
                            bool Sign     = (Format >> 14) == 1;
                            int  IntPart  = (int)((Format >> 7) & 0x7F);
                            int  FracPart = (int)(Format & 0x7F);
                            Result = new Vector3(ReadFixedPoint(Sign, IntPart, FracPart), ReadFixedPoint(Sign, IntPart, FracPart), ReadFixedPoint(Sign, IntPart, FracPart));
                        }
                    }
                    else if (FieldType.Name == "Vector4")
                    {
                        uint Format = GetAttributeValue <uint>(f, typeof(BinaryFixedPointAttribute), 0);
                        if (Format == 0)
                        {
                            Result = ReadVector4();
                        }
                        else
                        {
                            bool Sign     = (Format >> 14) == 1;
                            int  IntPart  = (int)((Format >> 7) & 0x7F);
                            int  FracPart = (int)(Format & 0x7F);
                            Result = new Vector4(ReadFixedPoint(Sign, IntPart, FracPart), ReadFixedPoint(Sign, IntPart, FracPart), ReadFixedPoint(Sign, IntPart, FracPart), ReadFixedPoint(Sign, IntPart, FracPart));
                        }
                    }
                    else
                    {
                        //new T(this);
                        Result = FieldType.InvokeMember("", BindingFlags.CreateInstance, null, null, new object[] { this });
                    }
                }
                if (f.MemberType == MemberTypes.Property)
                {
                    ((PropertyInfo)f).SetValue(obj, Result, null);
                }
                else
                {
                    ((FieldInfo)f).SetValue(obj, Result);
                }
                byte[] bsig = GetAttributeValue <byte[]>(f, typeof(BinaryByteArraySignatureAttribute), null);
                if (bsig != null && Result is byte[])
                {
                    if (!bsig.SequenceEqual((byte[])Result))
                    {
                        throw new SignatureNotCorrectException("{ " + BitConverter.ToString((byte[])Result, 0, ((byte[])Result).Length).Replace("-", ", ") + " }", "{ " + BitConverter.ToString(bsig, 0, bsig.Length).Replace("-", ", ") + " }", BaseStream.Position - ((byte[])Result).Length);
                    }
                }
                else
                {
                    string ssig = GetAttributeValue <string>(f, typeof(BinaryStringSignatureAttribute), null);
                    if (ssig != null && Result is string)
                    {
                        if (!ssig.Equals(Result))
                        {
                            throw new SignatureNotCorrectException((string)Result, ssig, BaseStream.Position - ssig.Length);
                        }
                    }
                }
                if (f.GetCustomAttributes(typeof(BinaryBOMAttribute), true).Length != 0)
                {
                    uint LittleEndian = GetAttributeValue <uint>(f, typeof(BinaryBOMAttribute), 0);
                    if (Convert.ToUInt32(Result).Equals(LittleEndian))
                    {
                        Endianness = IO.Endianness.LittleEndian;
                    }
                    else
                    {
                        Endianness = IO.Endianness.BigEndian;
                    }
                }
            }
        }
コード例 #3
0
 public BinaryBooleanSizeAttribute(BooleanSize Size)
 {
     this.Size = Size;
 }