Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2015, 02:23   #1
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию Вырезать\Обрезать\Скопировать Часть Stream

Собственно сабж, пару древних тем видел, понял уже что только через SetSize можно обрезать КОНЕЦ Stream, но вот как скопировать кусок или
обрезать текущий что-то не пойму.
Параметры:
8323 - то что мне нужно, обычно оно в конце, точнее всегда.
Размер Mem до 60000 в начале идет мусор и в конце мои данные.
Код:
      if mem.size>8323 then
        begin
          TempMem:=TMemoryStream.Create;
          try           
            mem.position:=mem.size-8323;
            TempMem.CopyFrom(mem,8323);//тут всегда ошибка, почему-то, работает только LoadFromStream
            TempMem.SetSize(8323);
            TempMem.SaveToFile(Sett.ControlName+'1');
          finally
            TempMem.free;
          end;
        end;
IvaniuS вне форума Ответить с цитированием
Старый 29.12.2015, 02:41   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Ясен пень ошибка. Хэлп про copyfrom() прочитай.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 29.12.2015, 10:33   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
тут всегда ошибка
Какая?......
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.12.2015, 12:39   #4
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

"Stream read error"
ошибка, по байтно я знаю как сделать или через буфер, но не хочу использовать эти велосипеды, в теории можно сделать как-то так:
Код:
var
baBuf: array [0..8323] of byte;
begin
mem.seek(mem.size-8323,soFromBeginning);
mem.WriteBuffer(baBuf,8323);//<<<<<<<Stream read error
TempMem.ReadBuffer(baBuf,8323);
TempMem.SaveToFile....
end;

Последний раз редактировалось IvaniuS; 29.12.2015 в 12:42.
IvaniuS вне форума Ответить с цитированием
Старый 29.12.2015, 12:58   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А ты уверен что у тебя в потоке байт больше чем 8323?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.12.2015, 13:13   #6
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Да я size всегда проверяю Там у меня бывает "reserved size 65798", а бывает ровно 8323 без мусора...
Нагуглил сейчас пытаюсь вот эту процедуру переделать
Код:
procedure CutFromStream(Stream: TStream; Start, Length: Int64);
var
  Buffer: Pointer;
  BytesToRead: Int64;
  BytesRemaining: Int64;
  SourcePos, DestPos: Int64;
begin
  SourcePos := Start+Length;
  DestPos := Start;
  BytesRemaining := Stream.Size-SourcePos;
  GetMem(Buffer, BytesRemaining);
  try
      BytesToRead := BytesRemaining;
      Stream.Position := SourcePos;
      Stream.ReadBuffer(Buffer^, BytesToRead);
      Stream.Position := DestPos;
      Stream.WriteBuffer(Buffer^, BytesToRead);
      inc(SourcePos, BytesToRead);
      inc(DestPos, BytesToRead);
      dec(BytesRemaining, BytesToRead);
    Stream.Size := DestPos;
  finally
    FreeMem(Buffer, BytesRemaining);
  end;
end;
Переписал ее вот так:
Код:
procedure CutFromStream(Stream: TStream; Start, Length: Int64);
var
  Buffer: Pointer;
  BytesToRead: Int64;
  BytesRemaining: Int64;
  SourcePos, DestPos: Int64;
begin
  SourcePos := Start+Length;
  BytesRemaining := Length;
  GetMem(Buffer, BytesRemaining);
  try
      Stream.Position := SourcePos;
      Stream.ReadBuffer(Buffer^, BytesRemaining);
      Stream.Position := soFromBeginning;
      Stream.WriteBuffer(Buffer^, BytesRemaining);
      Stream.Size := Length;
  finally
    FreeMem(Buffer, BytesRemaining);
  end;
end;

Последний раз редактировалось IvaniuS; 29.12.2015 в 13:30.
IvaniuS вне форума Ответить с цитированием
Старый 29.12.2015, 13:29   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Нацарапал за 2 минуты. Юзай.
Код:
unit uMyStreams;

interface

uses Classes;

type
  TMemoryStreamEx = class(TMemoryStream)
  public
    function CanRead(const AOffset, ASize: UInt64): Boolean;
    function CanWrite(const AOffset: UInt64): Boolean;
  end;

implementation

{ TMemoryStreamEx }

function TMemoryStreamEx.CanRead(const AOffset, ASize: UInt64): Boolean;
begin
  Result:= Size >= AOffset + ASize;
end;

function TMemoryStreamEx.CanWrite(const AOffset: UInt64): Boolean;
begin
  Result:= AOffset <= Size;
end;

end.
ВНИМАНИЕ!
УВАГА!!
АХТУНГ!!!
АТТЕНШН!!!!

Shit-code detected!
Код не отлаживал. Писал на заборе!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 29.12.2015, 13:30   #8
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Зачем мне это?
у меня стоит
Код:
if mem.size>8323 then
        begin
...
Что это вообще такое, вы тему прочитали, вопрос в том чтобы ВЫРЕЗАТЬ КУСОК или УДАЛИТЬ части данных Steam.

Последний раз редактировалось IvaniuS; 29.12.2015 в 13:34.
IvaniuS вне форума Ответить с цитированием
Старый 29.12.2015, 13:43   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Мы тему прочитали и прекрасно поняли.
И написали тебе класс, не позволяющий допустить ошибку stream read (write) error.
А ты хотел, чтобы мы за тебя всю-всю-всю работу сделали? Иш ты какой быстрый!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 29.12.2015, 13:55   #10
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Вот у Вас в подписи же даже статья висит про Х, Y, Z, а Вы мне пишете, ну обьявил я класс и использовал его в примере выше, првоерил свой старый код и получил "Stream read error", спасибо за старания.
Выше я уже написал в тот момент, когда Вы мне прислали Ваш Класс.
Переписал ее вот так:
Код:
procedure CutFromStream(Stream: TStream; Start, Length: Int64);
var
  Buffer: Pointer;
  BytesToRead: Int64;
  BytesRemaining: Int64;
  SourcePos, DestPos: Int64;
begin
  SourcePos := Start+Length;
  BytesRemaining := Length;
  GetMem(Buffer, BytesRemaining);
  try
      Stream.Position := SourcePos;
      Stream.ReadBuffer(Buffer^, BytesRemaining);
      Stream.Position := soFromBeginning;
      Stream.WriteBuffer(Buffer^, BytesRemaining);
      Stream.Size := Length;
  finally
    FreeMem(Buffer, BytesRemaining);
  end;
end;
Но все-равно получаю ошибку чтения данных из потока.

Последний раз редактировалось IvaniuS; 29.12.2015 в 14:08.
IvaniuS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C/C++ вырезать часть данных с файла Krasiosoft Общие вопросы C/C++ 11 27.07.2015 11:41
вырезать часть строки влад1991 Общие вопросы Delphi 8 14.04.2013 00:34
Flash Вырезать часть изображения demon112 Общие вопросы Web 1 09.04.2013 15:54
Вырезать часть строки montreyka Общие вопросы Delphi 4 26.03.2012 22:40
Вырезать часть строки. sergeyrulit Общие вопросы Delphi 2 22.10.2010 22:25