Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
genock94
20 / 20 / 1
Регистрация: 16.11.2012
Сообщений: 348
#1

Распаковка SWF-файла, сжатого алгоритмом deflate. ZLIB - C++

13.06.2015, 23:58. Просмотров 756. Ответов 0
Метки нет (Все метки)

Добрый вечер, уважаемые форумчане!
Пытаюсь распаковать сжатый SWF-файл. Вот сам файл:
body.rar
В документации по формату SWF сказано, что первые первые 3 байта равны "C", "W" и "S" соответственно (в случае сжатого ZLIB-ом SWF-файла). Далее идет байт, описывающий версию SWF-файла (в моём случае 0x0E = 14дес.). Дальше идут 4 байта, содержащие длину всего распакованного файла (включая заголовок). А дальше, начиная с 9-го байта, идут сжатые данные.
Пытался распаковать, используя следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <assert.h>
#include <zlib.h>
 
using namespace std;
 
#define CHECK_ERR(err, msg) { \
    if (err != Z_OK) { \
        fprintf(stderr, "%s error: %d\n", msg, err); \
        system("pause"); \
        exit(1); \
    } \
}
 
/***************************************************************************/
void test_inflate( Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)
{
    int err;
    z_stream d_stream; /* decompression stream */
 
    strcpy((char*)uncompr, "garbage");
 
    d_stream.zalloc = (alloc_func)0;
    d_stream.zfree = (free_func)0;
    d_stream.opaque = (voidpf)0;
 
    d_stream.next_in  = compr;
    d_stream.avail_in = 0;
    d_stream.next_out = uncompr;
 
    err = inflateInit(&d_stream);
    CHECK_ERR(err, "inflateInit");
 
    while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
        d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
        err = inflate(&d_stream, Z_NO_FLUSH);
        if (err == Z_STREAM_END) break;
        CHECK_ERR(err, "inflate");
    }
 
    err = inflateEnd(&d_stream);
    CHECK_ERR(err, "inflateEnd");
}
/***************************************************************************/
int main()
{
    const unsigned int HEADER_SIZE = 8;
    FILE*  input = fopen("C:\\...\\body.txt", "rb");
    if (!input){
        cout << "Input open error." << endl;
        system("pause");
        return -1;
    }
    FILE*  output = fopen("C:\\...\\uncompressed.txt", "wb");
    if (!output){
        cout << "Output open error." << endl;
        system("pause");
        return -1;
    }
    
    Byte* compressed;
    Byte* uncompressed;
    Byte buf[HEADER_SIZE+1];
 
    int compLen = 0;
    int uncompLen = 0;
 
    fread(buf,1,HEADER_SIZE,input);
    uncompLen = *((int*)&(buf[4]));
    fseek(input,0,SEEK_END);
    compLen = ftell(input) - HEADER_SIZE;
    fseek(input, HEADER_SIZE, SEEK_SET);
 
    cout << "  Compressed stream Length: " << setw(10) << compLen << endl;
    cout << "Uncompressed stream Length: " << setw(10) << uncompLen << endl;
    cout << endl;
 
    buf[0] = 'F';
    fwrite(buf,sizeof(Byte),HEADER_SIZE,output);
 
    compressed = (Byte*) calloc (compLen, sizeof(Byte));
    uncompressed = (Byte*) calloc (uncompLen, sizeof(Byte));
    if (compressed == Z_NULL || uncompressed == Z_NULL) {
        printf("out of memory\n");
        exit(1);
    }
 
    fread(compressed,1,compLen,input);
    test_inflate(compressed, compLen, uncompressed, uncompLen);
    fwrite(uncompressed,1,uncompLen,output);
 
    fclose(input);
    fclose(output);
    system("pause");
    return 0;
}
Однако, на 89-й итерации цикла WHILE
C++
1
err = inflate(&d_stream, Z_NO_FLUSH);
вернула "-3". В поле msg потока d_stream появилось сообщение: invalid bit length repeat, а в поле state dummy=29.
Вопрос: что я сделал не так? Почему не получается распаковать файл? Может, я не правильно распаковываю?
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2015, 23:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Распаковка SWF-файла, сжатого алгоритмом deflate. ZLIB (C++):

Распаковка сжатого контента HTTP ответа. - Visual C++
Столкнулся с тем, что некоторые сервера попросту игнорируют в некоторых случаях значение &quot;Accept-encoding&quot; в заголовке запроса и всегда...

С++ упаковка и распаковка файлов Zlib или любой другой способ - C++
Здравствуйте, возникла такая проблема, немогу упаковать файл и распаковать, пытаюсь использовать Zlib, http://www.zlib.net/manual.html...

Распаковка файла - C++
Всем привет! Мне нужна маленькая помощь,мне нужно написать программу для распаковки файла в формате .sf Суть такая: Выбираешь...

Распаковка файла - C++
Здравствуйте! Столкнулся с проблемой в распаковке екзешного файла с помощью огромного количества распаковщиков. Пишет сообщение Microsoft...

Упаковка/распаковка стороннего файла в exe - C++
Добрый день, товарищи и коллеги. Благодаря руководству столкнулся со следующей задачей : Необходимо написать программу, которая...

Запаковка\Распаковка массива байт (Zlib) - Delphi
Всем привет, появилась проблема. Имееться код на шарпе public static byte deflate(byte buffer) { ...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2015, 23:58
Привет! Вот еще темы с ответами:

При запуске tomcat должна была произойти распаковка war-файла, но распаковка не происходит - Java EE
Здравствуйте! Такая проблема..экспортировал из eclipse в war-файл в папку webapps. При запуске сервера должна была произойти распаковка, но...

Открытие файла SWF из SWF - ActionScript
Приветствую, имеются два ролика SWF - один кнопка, второй большая анимированная сцена. Как по нажатию кнопки открыть сцену, в Player...

Загрузка Swf файла в Swf - ActionScript
Привет всем,в данный момент хочу сделать себе веб страницу во Flash страница состоит с 3 swf файлов Index.swf 850 x 850...

Распаковка файла - Assembler
Доброго времени суток уважаемые форумчане. у меня возникла необходимость распаковать файл &quot;exe&quot; из у всей инфы, которую удалось найти в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru