Что такое важные моменты при разработке (двоичного) формата файла? [закрытый]

Это потому, что это функция SQL, а не PHP. Вы можете использовать PDO::lastInsertId() .

Как:

$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();

Если вы хотите сделать это с помощью SQL вместо PDO API, вы бы сделали это как обычный запрос выбора:

$stmt = $db->query("SELECT LAST_INSERT_ID()");
$lastId = $stmt->fetchColumn();

41
задан oliver 27 November 2008 в 22:26
поделиться

7 ответов

Все это зависит от цели формата, конечно.

Один гибкий подход должен структурировать весь файл как TLV (Значение длины тега) триплеты. Например, сделайте свой файл состоявшим из записей, каждая запись, начинающаяся с 4-байтового заголовка:

1 byte  = record type
3 bytes = record length
followed by record content

Относительно порядка байтов при хранении индикатора порядка байтов в файле все приложения должны будут поддерживать все форматы порядка байтов. С другой стороны, при определении конкретного порядка байтов для файлов только приложения на платформах с несоответствием порядку байтов должны будут сделать дополнительную работу, и это может быть решено во время компиляции (использующий условную компиляцию).

11
ответ дан atzz 4 August 2019 в 21:32
поделиться

Один способ соответствовать требованиям завтрашнего дня файл состоял бы в том, чтобы предусмотреть блоки. Прямо после Ваших данных заголовка файла, можно начать первый блок. Блок мог иметь байт или шифр для типа блока, затем размер в байтах. Теперь можно произвольно добавить новые типы блока, и можно пропустить до конца блока.

2
ответ дан Bork Blatt 4 August 2019 в 21:32
поделиться

Смотрите на спецификация PNG. Этот формат имеет некоторое очень хорошее объяснение позади него.

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

Что касается порядка байтов, я предложил бы, чтобы Вы выбрали одну опцию и придерживались его, не позволяя различные заказы байта. Иначе чтение и запись библиотек только станут более сложными и медленнее.

25
ответ дан Stepan Stolyarov 4 August 2019 в 21:32
поделиться

Я соглашаюсь с предложением atzz использования Системы ценностей Длины Тега. Для будущей совместимости Вы могли сохранить ряд "указателей" на записи TLV в запуске (или возможно Тег, Указатель и иметь точку указателя к Длине, Значению; или возможно Тег, Длина, Указатель и затем имеют все данные вместе в другом месте?).

Так, мой файл мог посмотреть что-то как:

magic number/file id
version
tag for first data entry
pointer to first data entry --------+
tag for second data entry           |
pointer to second data entry        |
...                                 |
length of first data entry <--------+
value for first data entry
...

магическое число, версия, теги, указатели и длины все были бы предопределенной длиной набора для легкого декодирования. Скажите, 2 байта. Или 4, в зависимости от того, в чем Вы нуждаетесь. Они не должны все быть тем же (например, все теги составляют 1 байт, указатели равняются 4 и т.д.).

тег сообщает то, что хранится. указатель говорит Вам, где (или смещение или абсолютное значение, в байтах), длина говорит Вам, насколько большой данные, и , значение длина байты данных тега типа . При использовании декодера MyFileFormat v1 на файле MyFileFormat v2 указатели позволяют Вам пропускать разделы, которые не понимает v1 декодер. При простом пропуске недопустимых тегов можно, вероятно, просто использовать TLV вместо TPLV.

я или вручил бы коду что-то как этот, или возможно определил бы мой формат в ASN.1 и генерировал бы кодек (я работаю в телекоммуникациях, таким образом, ASN.1/TLV имеет смысл мне:-D)

2
ответ дан Dan 4 August 2019 в 21:32
поделиться

Я соглашаюсь, что это хорошие идеи:

  1. Магические числа вначале. В значительной степени потребовал в *, отклоните:

  2. Номер версии файла для назад совместимости.

  3. спецификация Порядка байтов.

, Но Ваш четвертый излишество, потому что № 2 позволяет Вам добавить поля, пока Вы изменяете номер версии (и, пока Вам не нужно прямая совместимость ).

  • возможно резерв некоторое пространство для дальнейшего, на атрибуты файла, который мог бы быть необходимым в будущем?

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

В дополнение к 1-3 выше, я добавил бы их:

  • простая контрольная сумма или другой способ обнаружить, что содержание неповреждено. Иначе Вы не можете доверять волшебным байтам или номерам версий. Старайтесь для спецификации, какие байты включены в контрольную сумму. Обычно Вы включали бы все байты в файл, которые уже не имеют обнаружения ошибок.

  • версия Вашего программного обеспечения (включая самое детализированное число Вы имеете, например, номер сборки), который записал файл. Вы собираетесь получить отчет об ошибках с прикрепленным файлом от кого-то, кто не может открыть его, и у них не будет подсказки, когда они записали файл, потому что ошибка не произошла тогда. Но ошибка находится в версии, которая записала его, не в том, пытающемся считать ее.

  • Проясняют в спецификации, что это двоичный файл формат, т.е. все значения 0-255 позволяются для всех байтов (кроме магических чисел).

И вот некоторые дополнительные:

  • при необходимости в прямой совместимости Вам нужен некоторый способ выразить, какие "блоки" являются "дополнительными" (как png, делает), так, чтобы предыдущая версия Вашего программного обеспечения могла перескочить через них корректно.

  • , Если Вы ожидаете, что эти файлы будут найдены "в дикой природе", Вы могли бы полагать, что встраивание некоторой подсказки нашло спецификацию. Вообразите, как полезный это должно было бы найти строку http://www.w3.org/TR/PNG/ в png файле.

16
ответ дан Bart 4 August 2019 в 21:32
поделиться

Удостоверьтесь, что Вы резервируете код тега (или еще лучше резервируете немного в каждом теге), который определяет, удалил/освободил блок/блок. Блоки могут тогда быть удалены путем простого изменения текущего кода тега блока на удаленный код тега или устанавливают удаленный бит тега. Таким образом, Вы не должны сразу же полностью реструктурировать свой файл при удалении блока.

Резервирование немного в теге предоставляет возможность возможного восстановления после удаления блока (если Вы оставляете данные блока без изменений).

Для безопасности, однако Вы могли бы хотеть обнулить данные удаленного блока, в этом случае Вы будете использовать специальное предложение, удалил/освободил тег.

я соглашаюсь с Stepan, что необходимо выбрать порядок байтов, но у меня также был бы индикатор порядка байтов в файле. При использовании индикатора порядка байтов, Вы могли бы рассмотреть использование одного из , Порядок байтов UniCode отмечает также как inidicator любого текстового кодирования UniCode, используемого для любых текстовых блоков. BOM обычно является первыми несколькими байтами текстовых файлов UniCoded, поэтому если Ваш BOM является первой записью в Вашем файле могла бы быть проблема некоторой утилиты, идентифицирующей Ваш файл как текст UniCode (я не думаю, что это - очень проблема). Я рассматривал бы/резервировал бы BOM как один из Ваших нормальных тегов (использующий или UTF16 BOM при использовании тегов на 16 битов или UTF32 BOM при использовании тегов на 32 бита) с 0 блоками/блоками длины.

См. также http://en.wikipedia.org/wiki/File_format

3
ответ дан Roger Nelson 4 August 2019 в 21:32
поделиться

Я полагал бы, что определение подструктуры что использование более высоких уровней хранит данные, немного как мини-файловая система в файле.

, Например, даже при том, что Ваш формат файла собирается хранить специализированные данные, я рассмотрел бы записи определения / потоки и т.д. в файле таким способом, которым агностический приложением код в состоянии понять расположение файла, но не, конечно, понять непрозрачные полезные нагрузки.

Позволяют нам стать немного более конкретными. Рассмотрите обычные способы хранить данные в памяти: обычно они могут быть сведены к любой непрерывные расширяемые массивы / списки, pointer/reference-based графики, и двоичные блобы данных в особенности форматируют.

Таким образом, это может быть плодотворно для определения формата двоичного файла вдоль подобных строк. Используйте рекордные заголовки, которые указывают на длину и состав следующих данных, является ли это в форме массива (список тождественно введенных записей), ссылки (смещения к другим записям в файле), или блобы данных (например, строковые данные в конкретном кодировании, но не содержащий какие-либо ссылки).

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

Это - всего одна идея. Другие места для поиска идей находятся в общих проектах файловой системы или реляционной базе данных физические стратегии хранения.

, Конечно, в зависимости от Ваших требований, это может быть излишеством. Можно просто быть после двоичного формата для сохранения данных в оперативной памяти, в этом случае подход для рассмотрения отмечен записи.

В этом подходе, каждая часть данных снабжается префиксом тег. Тег указывает на тип сразу после данных, и возможно его длины и имени. Списки могут быть снабжены суффиксом тег "списка конца", который не имеет никакой полезной нагрузки. Тег может иметь встроенный идентификатор, таким образом, теги, которые не поняты, могут быть проигнорированы механизмом сериализации, когда это читает вещи в. Это немного похоже на XML в этом отношении, кроме использования двоичных идиом вместо этого.

На самом деле, XML является хорошим местом для поиска долгосрочной долговечности формата файла. Посмотрите на его возможности пространства имен. При построении чтения и записи кода тщательно должно быть возможно записать приложения, которые сохраняют местоположение и содержание теговых (рекурсивно) данные, которые они не понимают, возможно потому что это было записано более поздней версией того же приложения.

3
ответ дан Barry Kelly 4 August 2019 в 21:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: