Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.06.08;
Скачать: CL | DM;

Вниз

ZLIB (с мусором в конце) в XE/XE2 - косячит?   Найти похожие ветки 

 
klimov   (2011-12-27 08:11) [0]

Пытаюсь распаковать файл методом ZLIB.
НО: неужели зависит от места расположения архива?????
Т.е. набросал прогу которая распаковывает один и тот же архив, но по первой кнопке берет с корня диска C, вторая кнопка с текущей папки программы.
Результат распаковки разный.
Может уважаемый ГУРУ подскажет где я ошибся?

Весь проект прикладываю (Исполнимый файл присутствует)
PS: распаковать в корень диска C:/
Компиляцию выполнена на Delphi XE2 (проверено и на Delphi XE)


 
klimov   (2011-12-27 08:14) [1]

вот ссылка на проект: http://rghost.ru/35622004


 
sniknik ©   (2011-12-27 11:16) [2]

> где я ошибся?
в юникоде? библиотека zlib-а не завязана на строки?

> НО: неужели зависит от места расположения архива?????
от памяти которая выделена записалась но не использовалась. т.е. выделили случайную и записали.
сделай 2 подряд из одного и того же места в разные файлы, что получилось?


 
Ega23 ©   (2011-12-27 12:09) [3]

procedure ZCompressStream(Stream: TMemoryStream; Level: TCompressionLevel = clDefault);
var
 pOut: Pointer;
 outSize: Integer;
begin
 ZCompress(Stream.Memory, Stream.Size, pOut, outSize, cZCompLevel[Level]);
 Stream.Clear;
 Stream.WriteBuffer(pOut^, outSize);
 Stream.Position := 0;
 FreeMem(pOut);
end;

//*****************************************************************************

procedure ZDecompressStream(Stream: TMemoryStream);
var
 pOut: Pointer;
 outSize: Integer;
begin
 ZDecompress(Stream.Memory, Stream.Size, pOut, outSize);
 Stream.Clear;
 Stream.WriteBuffer(pOut^, outSize);
 Stream.Position := 0;
 FreeMem(pOut);
end;


 
klimov   (2011-12-28 07:34) [4]

Если файл в текущей дирректории (кнопка "00015068" - Button3Click) все отлично, и размер распакованного файла верный.

Если файл на диске C:\ (кнопка "C:\00015068" - Button2Click) получаем исключение:
Project Project.exe raised exception class EZDecompressionError with message ‘buffer error’


 
klimov   (2011-12-28 07:40) [5]


> > НО: неужели зависит от места расположения архива?????
> от памяти которая выделена записалась но не использовалась.
>  т.е. выделили случайную и записали.
> сделай 2 подряд из одного и того же места в разные файлы,
>  что получилось?

Если взять файлы с разных мест, а писать в одно место, т.е. исправить:
в procedure TForm1.Button2Click(Sender: TObject);
...
outStream.SaveToFile("00015068_C");
...
то независимо в какой последовательности нажать кнопки. С текущей директории распаковывает верно, а с диска С:\ неверно!


 
klimov   (2011-12-28 07:46) [6]

Ega32
> procedure ZDecompressStream(Stream: TMemoryStream);


тут описано почему такая ошибка возникает:
http://webcache.googleusercontent.com/search?q=cache:oviw8p_tzOYJ:https://forums.embarcadero.com/thread.jspa%3FthreadID%3D26424+raised+exception+class+EZDecompressionError+with+message+%E2%80%98buffer+error%E2%80%99&cd=1&hl=ru&ct=clnk&gl=ru

You then call zdecompress() with that buffer full of garbage, an outbuffer that you never allocated memory for (so it"s a nil pointer at best, and at worst a random memory location), and an outcount size that you never initialized (meaning it"s again a random number). No wonder zlib got confused.


 
klimov   (2011-12-28 07:51) [7]


> > НО: неужели зависит от места расположения архива?????
> от памяти которая выделена записалась но не использовалась.
>  т.е. выделили случайную и записали.
> сделай 2 подряд из одного и того же места в разные файлы,
>  что получилось?


Если брать файл в обоих случаях с диска С:\ - распаковывается НЕВЕРНО независимо куда.
Если брать файл в обоих случаях с текущей директории - распаковывается ВЕРНО независимо куда.


 
sniknik ©   (2011-12-28 09:33) [8]

скачал архив...
там 2 файла 00015068.ZLIB, один в корне другой в проекте... так вот если с C: положить файл из проекта то результаты одинаковы с текущим путем - т.е. ВЕРНЫЕ.
если из другой, из корня, то разные - т.е. НЕВЕРНЫЕ.
если из корня подложить в каталог проекта, то они опять становятся одинаковые...
указывай ПОЛНЫЙ путь всегда, не надейся на текущую директорию, и будет тебе "щастье". ИМХО.


 
klimov   (2011-12-28 09:46) [9]


> скачал архив...
> там 2 файла 00015068.ZLIB, один в корне другой в проекте.
> .. так вот если с C: положить файл из проекта то результаты
> одинаковы с текущим путем - т.е. ВЕРНЫЕ.
> если из другой, из корня, то разные - т.е. НЕВЕРНЫЕ.
> если из корня подложить в каталог проекта, то они опять
> становятся одинаковые...
> указывай ПОЛНЫЙ путь всегда, не надейся на текущую директорию,
>  и будет тебе "щастье". ИМХО.

А ты не пробовал сравнить что на C: и в проекте? файлы абсолютно одинаковые.
В том то и вопрос, почему результаты то разные?
Если указать полный путь к файлу - НЕВЕРНЫЙ результат будет.


 
sniknik ©   (2011-12-28 09:53) [10]

> В том то и вопрос, почему результаты то разные?
с чего это? я же написал одинаковые, если один исходный файл с разных мест то АБСОЛЮТНО (svn подтверждает, до байта) . но у тебя их там 2, исходных, и вот они РАЗНЫЕ.


 
klimov   (2011-12-28 09:56) [11]


> с чего это? я же написал одинаковые, если один исходный
> файл с разных мест то АБСОЛЮТНО (svn подтверждает, до байта)
> . но у тебя их там 2, исходных, и вот они РАЗНЫЕ.

Можешь код показать, что ты хочешь сказать?


 
klimov   (2011-12-28 09:59) [12]

Напиши длину в байтах распакованного файла на диске C:\ и в текущей папке.


 
sniknik ©   (2011-12-28 10:16) [13]

> Можешь код показать,
> скачал архив...
скачай его тоже... сам.

> что ты хочешь сказать?
хочу сказать что ты сам путаешься, разархивируешь разные архивы.

> Напиши длину в байтах распакованного файла на диске C:\
974 308 байт
> и в текущей папке.
974 308 байт

для исходного архива из каталога проекта ("текущей папке" по твоему определению), его класть на C:.

и
1 008 838 байт
также в обоих случаях для исходного архива  из корня архива. им заменить в каталоге проекта, и на диск C:.


 
klimov   (2011-12-28 13:22) [14]


> 974 308 байтдля исходного архива из каталога проекта ("текущей
> папке" по твоему определению), его класть на C:.и1 008 838
> байттакже в обоих случаях для исходного архива  из корня
> архива. им заменить в каталоге проекта, и на диск C:.

А вот теперь подумай сам как можно распаковать один и тот же архив и получить разные результаты?
Сравни файлы архива в корне С:\ и в "текущей директории"


 
klimov   (2011-12-28 13:25) [15]

Если ты утверждаешь, что сами файлы архивов на диске С и в "текущей папке" разные, то сообщи пожалуйста различия их.


 
sniknik ©   (2011-12-28 13:50) [16]

> Если ты утверждаешь
доказывать ничего не собираюсь, не хочешь не верь (при возможности проверить самому... идиотизм)

> то сообщи пожалуйста различия их.
17я строка... (почти не шутка)
не можешь сам сравнить? тогда все бесполезно, бросай это программирование. зачем оно тебе?


 
sniknik ©   (2011-12-28 13:56) [17]

простейший способ проверки, заархивируй оба rar-ом (есть точно), дефаултным сжатием, и посмотри размер - 366 057 байт у одного и 366 078 байт у другого.
или он тоже глючит?


 
klimov   (2011-12-28 14:06) [18]

Действительно, файлы-источники в архиве разные, извини, просто был уверен что распаковываю одно и то же.


 
Медвежонок Пятачок ©   (2011-12-28 14:07) [19]

Если брать файл в обоих случаях с диска С:\ - распаковывается НЕВЕРНО независимо куда.
Если брать файл в обоих случаях с текущей директории - распаковывается ВЕРНО независимо куда.


Это же классика жанра.

забытый ofNoChangeDir у опендиалога и приколы текущего каталога процесса связанные с этим.


 
Ega23 ©   (2011-12-29 12:18) [20]


> klimov   (28.12.11 07:46) [6]
>
> Ega32
> > procedure ZDecompressStream(Stream: TMemoryStream);
>
>
> тут описано почему такая ошибка возникает:


Не возникает никакой ошибки, это моя обёртка над ZLib. Причина - случайно нашёл файл, который паковался через нативный ZCompressStream, но обратно не распаковывался. Розыч говорил что-то, что у них там в кишках какой-то реальный косяк.
Через буфер же - всё нормально получилось.



Страницы: 1 вся ветка

Текущий архив: 2014.06.08;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.005 c
15-1385370166
Empleado
2013-11-25 13:02
2014.06.08
Немного о вирусах


2-1376933051
lancomm
2013-08-19 21:24
2014.06.08
поиск по базе


15-1385152203
Юрий
2013-11-23 00:30
2014.06.08
С днем рождения ! 23 ноября 2013 суббота


15-1385649765
BBC
2013-11-28 18:42
2014.06.08
Работа с видео из командной строки


15-1385361541
Igor_
2013-11-25 10:39
2014.06.08
"Обучалка" работы с программой. Какие есть готовые решения?