Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2014.06.08;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





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


15-1385238602
Юрий
2013-11-24 00:30
2014.06.08
С днем рождения ! 24 ноября 2013 воскресенье


15-1385584202
Юрий
2013-11-28 00:30
2014.06.08
С днем рождения ! 28 ноября 2013 четверг


15-1385394712
Абориген
2013-11-25 19:51
2014.06.08
Где взять карты из Windows?


2-1376989525
Novice
2013-08-20 13:05
2014.06.08
Как побороть "proxies.dcu"?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский