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); }