почитал описание формата COL на англ. вики _http://www.gtamodding.com/index.php?title=Collision_File
из описания ясно, что архив из нескольких файлов не имеет собственного заголовка, а файлы тупо склеены друг с другом.
Как лучше подойти к этому архиву, чтобы написать простой редактор архива (добавление, удаление, замена файлов)?
Нужно сформировать массив из имёни, размера и смещения.
Структура заголовка:
Первые 4 байта: 43 4F 4C 4C версия формата (COLL - означает первую версию)
Следущие 4 байта: 28 03 00 00 размер файла, начиная после этих 8 байт. Значение следует перевернуть - 00 00 03 28 и преобразовать в десятичное значение - 808 байт + 8 байт заголовка = 816 байт
Теперь 20 байт: 61 64 6D 69 72 61 6C 00 40 67 2F 00 17 39 40 00 40 67 2F 00 имя файла, где байты до первого фрагмента 00 собственно имя - admiral, а остальнео мусор (спасибо за подсказку Chipsman).
--------- updated -------------
Вроде получилось.

И так я открываю файл архива для чтения в бинарном режиме, читаю первые 4 байта, проверяю формат. Возвращаюсь опять на начало файла, читаю текущее смешение (позицию), читаю 28 байт, из них формирую размер и имя, складываю текущую позицию с размером и перехожу на это смещение, чтоб читать следующий файл в цикле.
While 1 ; цикл заполняет окно программы данными
;--------
$d_offset = FileGetPos ($o_vehicles_col); текущая позиция на файле в десятичном виде
$offset = Hex ($d_offset) ; смещение в HEX виде
;--------
$b_vehicles_col = FileRead ($o_vehicles_col, 28) ; читаем весь заголовок 4+4+20 байт
If @error = -1 Then ExitLoop ; если достигнут конец файла Выход из цикла
;--------
$size = BinaryMid ($b_vehicles_col, 5 , 4);размер файла в архиве в байтах
$size = Hex (_rotate($size)); переворачиваем байты и преобразуем в HEX
$size = Dec ($size)+ 8 ; преобразуем в десятичное значение и прибавляем 8 байт заголовка
;---------
$filename = BinaryMid ($b_vehicles_col, 9 , 20); читаем 20 байта (имя файла в архиве)
$filename = _GetName($filename)
;---------
GUICtrlCreateListViewItem ($filename&"|"&$size&"|"&$offset, $ListView1); заносим данные в ГУИ
FileSetPos ($o_vehicles_col, $d_offset+$size, $FILE_BEGIN); меняем позицию на файле
WEnd
Сообщение отредактировал OLEGator2: 02 June 2010 - 07:19















