Exemplo n.º 1
0
        public static object GetObject(PropertyItem prop)
        {
            object       result   = null;
            MetadataType dataType = (MetadataType)prop.Type;

            byte[] data = prop.Value;

            switch (dataType)
            {
            case MetadataType.String:
            {
                result = StringTools.StringFromByteArray(data, data.Length - 1);
            }
            break;

            case MetadataType.CharArray:
            {
                result = StringTools.StringFromByteArray(data, data.Length);
            }
            break;

            case MetadataType.Unicode:
            {
                result = Encoding.Unicode.GetString(data, 0, data.Length - 2); // TODO
            }
            break;

            case MetadataType.IntU16:
            {
                UInt16[] array = new UInt16[data.Length / sizeof(UInt16)];
                for (int i = 0; i < array.Length; i++)
                {
                    array[i] = BitConverter.ToUInt16(data, i * sizeof(UInt16));
                }
                result = array.Length == 1 ? (object)array[0] : (object)array;
            }
            break;

            case MetadataType.IntU32:
            {
                UInt32[] array = new UInt32[data.Length / sizeof(UInt32)];
                for (int i = 0; i < array.Length; i++)
                {
                    array[i] = BitConverter.ToUInt32(data, i * sizeof(UInt32));
                }
                result = array.Length == 1 ? (object)array[0] : (object)array;
            }
            break;

            case MetadataType.IntS32:
            {
                Int32[] array = new Int32[data.Length / sizeof(Int32)];
                for (int i = 0; i < array.Length; i++)
                {
                    array[i] = BitConverter.ToInt32(data, i * sizeof(Int32));
                }
                result = array.Length == 1 ? (object)array[0] : (object)array;
            }
            break;

            case MetadataType.FracU32:
            {
                UInt64[] array = new UInt64[data.Length / (2 * sizeof(UInt32))];
                for (int i = 0; i < array.Length; i++)
                {
                    int    pos   = i * 2 * sizeof(UInt32);
                    UInt32 numer = BitConverter.ToUInt32(data, pos);
                    UInt32 denom = BitConverter.ToUInt32(data, pos + sizeof(UInt32));
                    array[i] = ((((UInt64)denom) << 32) | numer);
                }
                result = array.Length == 1 ? (object)array[0] : (object)array;
            }
            break;

            case MetadataType.FracS32:
            {
                Int64[] array = new Int64[data.Length / (2 * sizeof(Int32))];
                for (int i = 0; i < array.Length; i++)
                {
                    int   pos   = i * 2 * sizeof(Int32);
                    Int32 numer = BitConverter.ToInt32(data, pos);
                    Int32 denom = BitConverter.ToInt32(data, pos + sizeof(Int32));
                    array[i] = ((((Int64)(UInt32)denom) << 32) | (UInt32)numer);
                }
                result = array.Length == 1 ? (object)array[0] : (object)array;
            }
            break;

            case MetadataType.Byte:
            case MetadataType.Undefined:
            default:
            {
                result = data != null?ArrayTools.DuplicateByteArray(data) : null;
            }
            break;
            }

            return(result);
        }