xpak - формат данных XPAK, используемый в бинарных пакетах Portage
К каждому бинарному пакету Gentoo прилагаются данные xpak, которые содержат различную информацию времени сборки - например, USE-флаги, с которыми пакет был скомпилирован, исходный ебилд, переменные окружения, значения переменных CFLAGS и CXXFLAGS и т.д.
Ниже описаны все рассматриваемые в данной документации случаи.
Целое число
Все отступы/длины являются беззнаковыми 32-разрядными целыми числами, с порядком следования байт от старшего к младшему.
Строка
Все строки в кодировке ASCII и не оканчиваются на NUL (кавычки - только для иллюстрации)
Значение
Текущие значения отдельных записей xpak хранятся как строки.
Вертикальная черта '|' не является частью формата файла; она используется лишь для иллюстрации того, как значения отступа применяются к данным.
бинарный пакет (tbz2)
|<-отступ_xpak->| <tar>|< xpak >|<отступ_xpak>"STOP"
xpak
"XPAKPACK"<строка_индекса><строка_данных><индекс><данные>"XPAKSTOP"
индекс
|<-------------строка_индекса------------->| |<индекс1><индекс2><индекс3><индекс4><...>|
индексN
|<-строка_имени->| <строка_имени>|< имя >|<отступ_данных><строка_данных>
данные
|<--------------строка_данных------------->| |<-отступ_данныхN->|<-строка_данныхN->| |< данные >|< данные_N >|<данные>|
Если вы рассмотрите любой бинарный пакет Gentoo с помощью шестнадцатиричного редактора, вы обнаружите, что он содержит собственно архив файлов, а далее бинарный блоб - xpak, отступ, содержащий байты от начала xpak'а до конца файла - отступ_xpak и, наконец, строку "STOP".
|<отступ_xpak>| <tar>|<---xpak---->|<отступ_xpak>"STOP"
В приведенном примере вы можете видеть архив tar, связанный с ним блоб_xpak, отступ_xpak и, в конце, строку "STOP". Эти метаданные не рассматриваются как часть xpak, а скорее как часть бинарного пакета.
Если мы возьмем значение оступа и отчитаем соответствующее ему количество байтов назад от начала отступа_xpak, то придем к блоку xpak, который начинается со строки "XPAKPACK".
Блок xpak состоит из строки "XPAKPACK", длины блока индекса (строка_индекса), длины блока данных (строка_данных), бинарный блоб строки_индекса, содержащий индекс, бинарный блоб строки_данных, содержащий данные, и строки "XPAKSTOP" в конце:
|<строка_индекса>|<строка_данных>| "XPAKPACK"<строка_индекса><строка_данных>|<--индекс-->|<--данные-->|"XPAKSTOP"
Чтобы получить индекс и данные, мы отсекаем с конца строки_данных количество байт, соответствующее строке_индекса (блок индекса), а затем - байты, соответствующие следующей строке_данных (блок данных). Если мы всё сделали правильно, следующие байты будут представлять собой строку "XPAKSTOP" в формате ASCII.
Все данные сведены в один большой блок; таким образом, чтобы их считать, необходимо знать фактическое положение каждого фрагмента информации в этом блоке. Эту информацию можно получить с помощью индексов, хранящихся в блоке индекса.
Блок _индекса включает ряд индексов:
|<-----------------------строка_индексов---------------------->| |<индекс1><индекс2><индекс3><индекс4><индекс5><индекс6><индекс7>|
Блок индекса содержит всю необходимую нам информацию для блока данных. Он содержит ряд отдельных индексов, которые все вместе составляют строку_индексов. Здесь нет разделения нулем или тому подобного.
Каждый из этих элементов соответствует фрагменту данных в блоке данных: строка имени этого блока (строка_имени), длина _строки_имени в байтах, оступ блока (отступ_данныхN) и длина блока (_строка_данныхN):
|<строка_имени>| <строка_имени>|<--имя-->|<отступ_данныхN><строка_данныхN>
Блок_данных содержит ряд фрагментов данных, которые в сумме образуют строку_данных:
|<------------------------строка_данных------------------------>| |<данные1><данные2><данные3><данные4><данные5><данные6><данные7><данные...>|
Для выбора одного элемента данных нам понадобится отступ_данных и строка_данных из индекса. Опираясь на них, мы можем рассчитать количество байтов в строке_данных от начала блока_данных, а затем отнять от них байты ближайшей следующей строки_данных. Тем самым мы получаем наш исходный блок данных:
|<-----отступ_данныхN----->|<--строка_данныхN->| |<данные1данные2данные3данные...>|<нужные_нам_данные>|
Предположим, что у нас есть xpak, содержащий два фрагмента данных. Один из них именуется "file1" и содержит строку "ddDddDdd", а другой - "file2" и содержит строку "jjJjjJjj". Данные не содержат "STOP" или отступ_xpak, поскольку данный xpak не является частью бинарного пакета.
Вот вывод шестнадцатиричных данных (построчно):
00 58 50 41 4b 50 41 43 4b 00 00 00 20 00 00 00 10 |XPAKPACK... ....| 10 00 00 00 04 66 69 6c 31 00 00 00 00 00 00 00 08 |....файл1........| 20 00 00 00 04 66 69 6c 32 00 00 00 08 00 00 00 08 |....файл2........| 30 64 64 44 64 64 44 64 64 6a 6a 4a 6a 6a 4a 6a 6a |ddDddDddjjJjjJjj| 40 58 50 41 4b 53 54 4f 50 |XPAKSTOP|
Строка_индекса имеет значение 32, а строка_данных - 16 (поскольку данные содержат 16 байт: "ddDddDdd" и "jjJjjJjj").
|<------"XPAKPACK"----->|| 32 | 16 | 00 58 50 41 4b 50 41 43 4b 00 00 00 20 00 00 00 10
А вот первый элемент индекса, значение строки_имени которого составляет 4, за ней идет строка "файл1", далее - отступ данных1 со значением 0 и данные1 со значением 8 (поскольку данные1 содержат 8 байт: "ddDddDdd"):
| 4 |<--"файл1"->||отступ_данных1:0|строка_данных1:8| 10 00 00 00 04 66 69 6c 31 00 00 00 00 00 00 00 08
Теперь рассмотрим второй элемент индекса, со значением строки_индекса 4; за ней идет строка индекса "файл2", отступ_данных2 со значением 8 и данные2 со значением 8 (поскольку данные2 содержат 8 байт: "jjJjjJjj").
| 4 |<--"файл2"->||отступ_данных2:8|строка_данных2:8| 20 00 00 00 04 66 69 6c 32 00 00 00 08 00 00 00 08
|<------"XPAKSTOP"----->| 40 58 50 41 4b 53 54 4f 50
qtbz2(1), quickpkg(1), qxpak(1)
Октябрь 2011
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |