ZStream

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

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

Ответить
BORNDEAD
незнакомец
Сообщения: 2
Зарегистрирован: 06.02.2009 16:15:02

ZStream

Сообщение BORNDEAD »

Помогите решить траблу
при вызове 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 секунд:
хех, вопрос сам решился
перед созданием потока декомпрессора нада исходный поток установить на начало
lordgray
новенький
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

Сообщение lordgray »

Код: Выделить всё

      
      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? Если нет, то даже не знаю, на что думать.
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

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

Добавлено спустя 25 секунд:
(я бы так и сделал)
lordgray
новенький
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

Сообщение lordgray »

Так, все сделал на 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 оказались не причем :(
Почему не работает? Что делать?
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

что если я скажу что после c.CopyFrom(Src, Src.Size); надо вызвать c.Free, и тогда ошибки тут не будет
lordgray
новенький
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

Сообщение lordgray »

Действительно! Большое спасибо! Все распаковалось как надо. Все, сейчас буду переделывать основную прогу.
Ответить