ZStream

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

ZStream

Сообщение BORNDEAD » 07.11.2009 16:58:21

Помогите решить траблу
при вызове read в TDeCompressionStream вываливает buffer error
FPC 2.2.4
Код: Выделить всё
var
  Mem,DecMem:TMemoryStream;
  buf:array[0..255] of byte;
...
  Decompressor:=TDecompressionStream.create(Mem, true);
  DecMem:=TMemoryStream.Create();
  i:=1;
  while i<>0 do
   begin
    i:=Decompressor.Read(buf,255);
    DecMem.Write(buf,i);
   end;
  Decompressor.Destroy;


Добавлено спустя 7 минут 57 секунд:
хех, вопрос сам решился
перед созданием потока декомпрессора нада исходный поток установить на начало
BORNDEAD
незнакомец
 
Сообщения: 2
Зарегистрирован: 06.02.2009 17:15:02

Re: ZStream

Сообщение lordgray » 30.04.2014 11:26:02

Код: Выделить всё
     
      Src := TMemoryStream.Create;
      Dst := TMemoryStream.Create;
      Query.Fields[0].SaveToStream(Src);
      j := Query.Fields[1].AsInteger;//размер неупакованных данных
      Src.Position := 0;
      Z := TdeCompressionStream.create(Src);
      for i := 1 to j do
      try
        Z.read(Buf[0], 1);
        Dst.Write(Buf[0], 1);
      except
        ShowMessage(Format('unpack =%d, pack=%d, current=%d', [j,Src.Size,Dst.Size]));
        Break;
      end;
      Dst.Position := 0;
      Dst.SaveToFile(St);


В базе запакованная PDF. Читаю ее, распаковываю, сохраняю на диск. При распаковке, после обработки 205695 байт из 229645, выдает "buffer error". В чем может быть причина?
Может быть в том, что паковалось из под Delphi, а распаковываю программой на Lazarus. Может разные версии ZLib? Если нет, то даже не знаю, на что думать.
lordgray
новенький
 
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

Re: ZStream

Сообщение hinst » 30.04.2014 12:40:58

Можно сделать чтобы программа на FPC распаковывал данные в точности тем же методом, которым программа на Delphi их запаковывает. Как? Надо просто создать динамическую или даже статическую библиотеку на той же версии Delphi, на которой делалась та программа, или же сделать это не в виде динамической библиотеки, а в виде утилиты без UI

Добавлено спустя 25 секунд:
(я бы так и сделал)
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: ZStream

Сообщение lordgray » 01.05.2014 11:20:05

Так, все сделал на Lazarus (1.2+FPC 2.6.2). Выбираю файл, пакую и тут же распаковываю. Не работает!

Код: Выделить всё
 
var
  i:Integer;
  Buf:array[0..1023] of Byte;
  Src, Dst: TMemoryStream;
  c: TCompressionStream;
  z: TdeCompressionStream;
begin
  if OpenDialog.Execute then
  begin
    Src := TMemoryStream.Create;
    Dst := TMemoryStream.Create;
    Src.LoadFromFile(OpenDialog.FileName);
    c := TCompressionStream.Create(clMax, Dst, False);
    c.CopyFrom(Src, Src.Size);//сжимаем файл из Src в поток Dst
    Dst.Position := 0;
    Src.Clear;//очищаем поток-приемник
    z := TdeCompressionStream.create(Dst, False);
    repeat//цикл распаковки
      i := z.read(Buf[0], SizeOf(Buf));
      Src.Write(Buf[0], i);
    until i <> SizeOf(Buf);
    St := ExtractFilePath(OpenDialog.FileName);
    St := St + '_zlib.pdf';
    Src.SaveToFile(St);
    OpenFile(St);
  end;
end;


Результат тот же: z.read(Buf[0], SizeOf(Buf)) дает ошибку "buffer error" при приближении к концу потока. Delphi и версия ZLib оказались не причем :(
Почему не работает? Что делать?
lordgray
новенький
 
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

Re: ZStream

Сообщение hinst » 01.05.2014 11:49:05

что если я скажу что после c.CopyFrom(Src, Src.Size); надо вызвать c.Free, и тогда ошибки тут не будет
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: ZStream

Сообщение lordgray » 01.05.2014 12:59:40

Действительно! Большое спасибо! Все распаковалось как надо. Все, сейчас буду переделывать основную прогу.
lordgray
новенький
 
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru