Какие данные Apple использует в примере с GLPaint?

Несколько месяцев назад я сделал приложение на основе Apple GLPaint. Это прекрасно работает.

Я записал наборы точек, которые рисуют простые рисунки на экране. и сохранил их как массив точек (преобразованный в NSValue).

сейчас я пытаюсь улучшить свое приложение, и я снова посмотрел на пример Apple. данные в их файле данных выглядят так (я немного изменил):

<data>
AAC8QgAAsEMAAMJCAICoQwAAwkIBBAKRDAADCQgCAnUMAAMJCAACYQwAAwEIAgJRDAADA
QgCAkkMAAMBCAACRQwAAwEIAgJBDAADAQgCAkEM=
</data>
<data>
AACoQgAAnEMAALpCAACdQwAAxEIAAJ1DAAGGGgAAnUMAANpCAICdQwAA4kIAgJ5DAADs
QgCAn0MAAOxCAICfQw==
</data>

Таким образом, каждая группа представляет собой один рисунок, и это намного компактнее, чем мои списки CGPoints.

Мне удалось преобразовать массив CGPoints в данные и прочитать файл обратно.

НО Когда я пытаюсь открыть каждый файл данных формы, я получаю это (в textMate, textEdit, xCode...):

один из файлов данных групп CGPointsЯ хочу понять:

  1. Что Apple использует для получения этого сжатого формата списка CGPoints?
  2. как я могу открыть файл данных в более читаемом виде?

person shannoga    schedule 10.07.2011    source источник


Ответы (2)


Данные в файле Apple Recording.data в этом пример приложения — это XML-представление Plist NSArray, содержащее набор объектов NSData, каждый из которых содержит байты, представляющие массив структур CGPoint. Обратите внимание, что это зависит от двоичного представления CGFloat и конкретного макета структуры CGPoint, который может различаться между компиляторами или версиями одного и того же компилятора.

Ваш снимок экрана выглядит как результат NSKeyedArchiver, который безопаснее, но имеет гораздо больше накладных расходов.

Если вам нужно компактное, но все же переносимое представление, вы можете вручную сериализовать отдельные CGFloats в массив байтов в переносимом формате (предыдущий вопрос может помочь вам в этом), а затем оберните массивы байтов в NSData, поместите NSData в NSArray и используйте writeToFile:atomically: для вывода беспорядка в plist, как это делает Apple.

person Anomie    schedule 15.07.2011

Похоже, это Base64. Эта страница упоминает об этом:

Обратите внимание, что байты данных кодируются по основанию 64 между тегами <data> и </data>.

<data> для NSData, который вы можете получить из массива с помощью +[NSKeyedArchiver archivedDataWithRootObject:].

person Georg Fritzsche    schedule 15.07.2011