BytesToRaw (Indy 10)
От: MikeSoft Украина msdn.at.ua
Дата: 22.06.10 19:32
Оценка:
Добрый день, уважаемые коллеги.

Реализовывая передачу изображения по протоколу UDP столкнулся с проблемой перевода TBytes в TMemoryStream.

Для теста создал новый проект. На форму поместил два TImage, один TButton, TIdUDPClient и TIdUDPServer.
В Image1 поместил PNG изображение (153 байта)

Настраиваю компоненты:
UDPServer->DefaultPort = 2050;
UDPClient->Port = 2050;
UDPClient->Host = "127.0.0.1";
UDPServer->Active = true;


В событии OnClick для Button1 выполняю передачу объекта серверу:
TMemoryStream *msS = new TMemoryStream();

TPngImage *png = new TPngImage();
png->Assign(Image1->Picture);

png->SaveToStream(msS);
msS->Position = soFromBeginning;

TByteDynArray DynArray = RawToBytes(msS,msS->Size);

delete png, msS;
png = NULL, msS = NULL;

UDPClient->SendBuffer(DynArray);


Передача проходит на "ура". Теперь обрабатываю событие OnUDPRead:
void __fastcall TForm1::UDPServerUDPRead(TIdUDPListenerThread *AThread, TBytes AData,
                    TIdSocketHandle *ABinding)
{
  TMemoryStream *msR = new TMemoryStream();
  TPngImage *png = new TPngImage();

  BytesToRaw(AData,msR,AData.Length);  // проблемое место
  msR->Position = soFromBeginning;
  png->LoadFromStream(msR);
  Image2->Picture->Graphic = png;

  delete png, msR;
  png = NULL, msR = NULL;
}


Картинка появляется в Image2, но при закрытии формы возникает Access Violation.

Функция BytesToRaw в третьем параметре требует int Size. Я передаю ей размер полученных данных (AData.Length) получаю всё тот же AV.
Пробую передать размер TBytes (пробовал также для TByteDynArray):
BytesToRaw(AData,msR,sizeof(AData));

В этом случае поток msR имеет нулевую длину и ссылается в NULL

Пробовал работать с этой функцией без сетевой передачи (далее изменённый код OnClick для Button1):
  TMemoryStream *msS = new TMemoryStream();

  TPngImage *png = new TPngImage();
  png->Assign(Image1->Picture);

  png->SaveToStream(msS);
  msS->Position = soFromBeginning;

  TByteDynArray DynArray = RawToBytes(msS,msS->Size);

  BytesToRaw(DynArray,msS,sizeof(DynArray));
  msS->Position = soFromBeginning;
  png->LoadFromStream(msS);
  mage2->Picture->Graphic = png;

  delete png, msS;
  png = NULL, msS = NULL;


Тогда ошибок не возникает.

Подскажите пожалуйста, что я делаю неправильно?
bytestoraw c++ builder 2010 indy 10 udp
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.