User Tag List

Страница 4 из 7 ПерваяПервая 1234567 ПоследняяПоследняя
Показано с 31 по 40 из 66

Тема: Баг в depacker от hrust1.3?

  1. #31

    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,094
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    выход из ситуации - добавить в конец пакуемого блока кучу нулей. штук так 50-200.

  2. #31
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #32

    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,094
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    именно так.

  4. #33

    Регистрация
    17.01.2005
    Адрес
    Tallinn
    Сообщений
    2,517
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    86
    Поблагодарили
    39 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SoftLight Посмотреть сообщение
    А разве распаковщик не знает, каков размер неупакованного блока? Всё еще с трудом понимаю, почему нахлест возникает. Ему для распаковки нужен какой-то буфер, который приплюсовывается к архиву, и поэтому оно не влезло?
    Просто я почитал первоначальный пример - там у меня распакованный файл весил примерно 6кб. Упакованный, соответственно, тоже не больше. Распаковка велась на 49152 - то есть 16 кб до конца памяти было, должен был влезть и упакованный, и распакованный вариант.
    Кстати, а megalz тоже так свободно по памяти катается?
    zxart.ee - архив программ, графики и музыки ZX Spectrum.

  5. #34

    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,094
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    следите за руками:

    0. допустим, есть у нас исходный файл в 6к, сжатый до 3х.

    1. распаковщик перемещает упакованный 3к блок так, что последний байт упакованного блока совпадает с посл. байтом будущего распакованного (т.е. он старается не занимать места больше, чем распакованный блок, не вылезать из этого окна).

    2. начинает распаковывать. чем дальше к окончанию распаковки, тем указатели ОТКУДА (упак.) и КУДА (распак.) ближе друг к другу. в идеале, в самом конце они совпадают

    3. при определенных условиях (те самые плохо сжимающиеся данные в конце) распакованные данные начинают перезатирать еще не распакованные... всё, капут.

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

  6. #35

    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,286
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    39 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от psb Посмотреть сообщение
    таким образом, просто добавляем много нулей в конец пакуемого блока и бережем нервы. когда ничего не перезатирается, когда есть запас, все хорошо
    Ну не всегда есть такая возможность. Иногда блок находится четко в конце памяти.

  7. #36

    Регистрация
    22.09.2006
    Адрес
    Ижевск
    Сообщений
    1,706
    Спасибо Благодарностей отдано 
    10
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Непонятен этот шаг с перемещением запакованного блока в конец распакованного.
    Для чего?
    Ведь запакованный блок УЖЕ находится в памяти. Неужели нельзя брать байты для распаковки прямо оттуда?
    Зачем его таскать по памяти то лишний раз?
    Хороший.. Плохой.. Главное - у кого ружьё !!

  8. #37

    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,867
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    311
    Поблагодарили
    235 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    John North,
    еще раз

    hrust программа универсальная и считает что файл который она распаковывает имеет размер #a000 и находится по адресу #6000
    поэтому он всегда старается переместить упакованный блок как можно дальше

    что и видно на данном фрагменте исходника

    DEHRUST PUSH DE
    PUSH HL
    берем размер распакованого блока
    INC HL
    INC HL
    LD C,(HL)
    INC HL
    LD B,(HL)
    INC HL

    вычисляем конец распакованых данных

    DEC BC
    EX DE,HL
    ADD HL,BC
    EX DE,HL

    берем длину пакованого блока

    LD C,(HL)
    INC HL
    LD B,(HL)
    DEC BC

    проверяем на вероятность затирания

    по умолчанию считается что блок будет загружен туда же куда будет распакован


    POP HL
    ADD HL,BC
    SBC HL,DE
    ADD HL,DE

    JR C,LL4019
    оставляем на месте

    LD D,H
    LD E,L
    LL4019 LDDR
    но последние 6 байт упакованного файла всегда сохраняются вместе с упаковщиком

    но если блок находится по адресу 60000
    а распаковывать надо например заставку он этот блок трогать не будет
    С уважением,
    Jerri / Red Triangle.

  9. #38

    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,094
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    Иногда блок находится четко в конце памяти.
    ну тогда ппц. городить костыльчик с перебрасыванием откуда-то еще.

    Цитата Сообщение от John North Посмотреть сообщение
    Ведь запакованный блок УЖЕ находится в памяти. Неужели нельзя брать байты для распаковки прямо оттуда?
    они могут пересекаться. универсальное решение, типа, привести к такому вот виду.

  10. #39

    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,286
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    39 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от John North Посмотреть сообщение
    Непонятен этот шаг с перемещением запакованного блока в конец распакованного.
    Для чего?
    Ведь запакованный блок УЖЕ находится в памяти. Неужели нельзя брать байты для распаковки прямо оттуда?
    Зачем его таскать по памяти то лишний раз?
    Ё-моё... ну ты хоть соображалку включи и представь что будет, если распаковывать в ту же память, где лежит упакованный оригинал.

  11. #40

    Регистрация
    17.01.2005
    Адрес
    Tallinn
    Сообщений
    2,517
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    86
    Поблагодарили
    39 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Мне, честно говоря, даже в голову не приходило, что можно попытаться распаковать блок с пересечением с упакованным файлом.
    Имхо, в таком случае в распаковщик нужно добавить проверку - если в памяти достаточно места, то не делать копирование. Размер распаковщика, конечно, вырастет, но геморроя уменьшится.
    С MegaLZ я не встречал такой ситуации ни разу - MegaLZ работает иначе или мне еще "повезет"?
    zxart.ee - архив программ, графики и музыки ZX Spectrum.

Страница 4 из 7 ПерваяПервая 1234567 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •