; AutoIt Version: 3.3.1.1 (beta) ; Author: упырь ; экстрактор файлов архивов с заголовком: SM2MPX10 ;- заголовок - ;8 байт - заголовок 'SM2MPX10' ;4 байта - количество файлов в архиве ;4 байта - размер заголовка, включая секции таблицы ;12 байт - внутренняя метка. имя файла архива ;4 байта - размер заголовка? всегда равен 32 байта ;- таблица - ;12 байт - имя файла в формате DOS. если длинней, обрезается ;4 байта - оффсет файла в архиве ;4 байта - размер файла ;- пустышка - ;4 байта - нули. не считаются в размере, указываемом в заголовке. ;- данные - ;----------------------------------------------------------- $file = FileOpen (@ScriptDir & "\GRP", 16); открываем для чтения в бинарном режиме $head = FileRead ($file, 8) $head_str = BinaryToString ($head) ; определяем количество файлов в архиве $kolichestvo = FileRead ($file, 4) $01 = StringMid($kolichestvo, 9, 2) $02 = StringMid($kolichestvo, 7, 2) $03 = StringMid($kolichestvo, 5, 2) $04 = StringMid($kolichestvo, 3, 2) $perevernutoe = $01&$02&$03&$04 $dec_colich = Dec ($perevernutoe) ; определяем размер заголовка с таблицами $razmer_zagolovka = FileRead ($file, 4) $01 = StringMid($razmer_zagolovka, 9, 2) $02 = StringMid($razmer_zagolovka, 7, 2) $03 = StringMid($razmer_zagolovka, 5, 2) $04 = StringMid($razmer_zagolovka, 3, 2) $perevernutoe = $01&$02&$03&$04 $dec_razmer = Dec ($perevernutoe) $dec_razmer -= 32; отнимаем 32 байта заголовка ; читаем таблицу целиком FileSetPos ($file, 32, 0); ставим каретку на начало файла $table = FileRead ($file, $dec_razmer) $filename = BinaryMid ($table, 1 , 12); читаем имя первого файла $filename_str = BinaryToString ($filename) $filename_str = StringReplace ($filename_str, BinaryToString ("0x00"), ""); удаляем нулевые байты $file_offset = BinaryMid ($table, 13 , 4);читаем оффсет файла в архиве $01 = StringMid($file_offset, 9, 2) $02 = StringMid($file_offset, 7, 2) $03 = StringMid($file_offset, 5, 2) $04 = StringMid($file_offset, 3, 2) $file_offset = "0x"&$01&$02&$03&$04 $dec_file_offset = Dec ($01&$02&$03&$04) $file_size = BinaryMid ($table, 17 , 4);читаем размер файла $01 = StringMid($file_size, 9, 2) $02 = StringMid($file_size, 7, 2) $03 = StringMid($file_size, 5, 2) $04 = StringMid($file_size, 3, 2) $file_size = $01&$02&$03&$04 $dec_file_size = Dec ($file_size) FileSetPos ($file, $dec_file_offset, 0); ставим каретку на начало файла внури архива $file_inside = FileRead ($file, $dec_file_size) $file_unpacked = FileOpen (@ScriptDir & "\" & $filename_str, 18) FileWrite ($file_unpacked, $file_inside) FileClose ($file_unpacked) FileClose ($file) MsgBox (0, "SM2MPX10 Extractor v 0.1", "Заголовок: "& $head_str&@CRLF _ & "количество файлов: "&$dec_colich&@CRLF&"Размер таблицы: "&$dec_razmer&" байта"&@CRLF _ & "имя файла: "& $filename_str&@CRLF&"оффсет файла в архиве: "&$file_offset&@CRLF _ & "размер файла: "&$dec_file_size&" байт") |