2011-10-15 1 views
0

Мне было интересно, как я могу извлечь файлы с помощью C#. Я знаю, что многие из вас скажут, что многие люди задавали вопросы по извлечению файлов с помощью C#, но я считаю, что формат сжатия, который я пытаюсь распаковать, - LZO. Я не совсем уверен, как это работает, и я просмотрел все классы, которые это сделают. Кроме того, этот файл не имеет магии LZO в верхней части файла, но я все еще уверен, что это LZO. Я думаю, это потому, что я загрузил другой инструмент, который был построен на C++, и требует «lzo1.dll» (download). Я также буду содержать файл ниже, который я пытаюсь выяснить, как извлечь. Спасибо за любую помощь :)Извлечение файлов LZO1 - C#

Попытки извлечь: http://www.fileserve.com/file/bzV4XEz/Save0.sgd

Кроме того, это информация о том, что программа, которая может извлечь показала мне после извлечения его: http://pastebin.com/xmHtZagG

+1

Быстрый поиск в Google появился LZO.Net: http://lzo-net.sourceforge.net/, и QuickLZ: http://www.codeproject.com/KB/recipes/ManagedQLZ.aspx и несколько другие. –

+0

Ну, что касается dll LZO.Net, я действительно посмотрел на это, и он, похоже, не работал. Не уверен, что я глуп или что-то в этом роде, но в первой строке кода он устанавливает LZOCompressor, равный LZOCompress, и похоже, что LZOCompress не существует в DLL. Кроме того, если вы установите LZOCompressor, равный LZOCompressor, тогда он выдает исключение. С другим в CodeProject он, похоже, не работает. Знаете ли вы, какие байты я должен поместить в метод QuickLZ.Decompress, потому что если я поместил весь файл там, он не сработает ... Просто интересно, попробовали ли вы какие-либо из этих методов? – hetelek

+0

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

ответ

2

Это lzo1.dll файл является публично доступную версию библиотеки декомпрессии LZO. Так как это, кажется, работает над вашим файлом, вы можете попробовать использовать его, особенно если библиотеки .NET LZO не работают на вас.

кажется, исчезли из обычного места (gnuwin32), но я нашел его здесь:

http://www.pytables.org/download/lzo-win/

После того, как вы есть, что вы можете использовать P/Invoke для вызова неуправляемых методов в библиотеке. В вышеприведенном архиве содержатся двоичные файлы, заголовочные файлы и справочные страницы - все, что вам нужно для создания собственного перевода C# P/Invoke. Просто делать декомпрессию не выглядит слишком сложный, только два вызова:

[DllImport("lzo1.dll", CallingConvention=CallingConvention.Cdecl)] 
public static extern int lzo_init (); 

[DllImport("lzo1.dll", CallingConvention=CallingConvention.Cdecl)] 
public static extern int lzo1x_decompress ( 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] byte[] src, 
    int src_len, 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=3)] byte[] dst, 
    int dst_len, 
    IntPtr wrkmem); 

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