private static extern void CFDataGetBytes(IntPtr theData, CFRange range, byte[] buffer);
internal static extern IntPtr CFStringGetCharacters(IntPtr handle, CFRange range, IntPtr buffer);
private static extern void CFArrayGetValues(IntPtr sourceRef, CFRange range, IntPtr values);
public static string PropertyListToXML(byte[] propertyList) { try { int length = propertyList.Length; if (propertyList[0] == 0x62 && propertyList[1] == 0x70 && propertyList[2] == 0x6c && propertyList[3] == 0x69 && propertyList[4] == 0x73 && propertyList[5] == 0x74 && propertyList[6] == 0x30 && propertyList[7] == 0x30) { IntPtr ptr = IntPtr.Zero; IntPtr ptr2 = IntPtr.Zero; ptr2 = CFPropertyListCreateFromXMLData(IntPtr.Zero, ptr2, CFPropertyListMutabilityOptions.kCFPropertyListImmutable, ref ptr); if (ptr2 != IntPtr.Zero) { ptr2 = CFPropertyListCreateXMLData(IntPtr.Zero, ptr2); length = CFDataGetLength(ptr2) - 1; propertyList = new byte[length + 1]; var range = new CFRange(0, length); CFDataGetBytes(ptr2, range, propertyList); } } return Encoding.UTF8.GetString(propertyList); } catch (Exception exception1) { } return null; }
internal static extern int CFStringGetBytes(IntPtr theString, CFRange range, uint encoding, byte lossByte, byte isExternalRepresentation, byte[] buffer, int maxBufLen, ref int usedBufLen);
internal static unsafe string FetchString(IntPtr handle) { if (handle == IntPtr.Zero) { return null; } var len = CoreFoundation.CFStringGetLength(handle); var ptr = CoreFoundation.CFStringGetCharactersPtr(handle); var zero = IntPtr.Zero; if (ptr == IntPtr.Zero) { var range = new CFRange(0, len); zero = Marshal.AllocCoTaskMem(len*2); CoreFoundation.CFStringGetCharacters(handle, range, zero); ptr = zero; } return new string((char*) ptr, 0, len); }