Здравствуйте, MikeSoft, Вы писали:
MS>Добрый день, уважаемые коллеги.
MS>Реализовывая передачу изображения по протоколу UDP столкнулся с проблемой перевода TBytes в TMemoryStream.
MS>Для теста создал новый проект. На форму поместил два TImage, один TButton, TIdUDPClient и TIdUDPServer.
MS>В Image1 поместил PNG изображение (153 байта)
MS>Настраиваю компоненты:
MS>UDPServer->DefaultPort = 2050;
MS>UDPClient->Port = 2050;
MS>UDPClient->Host = "127.0.0.1";
MS>UDPServer->Active = true;
MS>В событии OnClick для Button1 выполняю передачу объекта серверу:
MS>TMemoryStream *msS = new TMemoryStream();
MS>TPngImage *png = new TPngImage();
png->>Assign(Image1->Picture);
png->>SaveToStream(msS);
msS->>Position = soFromBeginning;
MS>TByteDynArray DynArray = RawToBytes(msS,msS->Size);
MS>delete png, msS;
MS>png = NULL, msS = NULL;
MS>UDPClient->SendBuffer(DynArray);
MS>Передача проходит на "ура". Теперь обрабатываю событие OnUDPRead:
MS>void __fastcall TForm1::UDPServerUDPRead(TIdUDPListenerThread *AThread, TBytes AData,
MS> TIdSocketHandle *ABinding)
MS>{
MS> TMemoryStream *msR = new TMemoryStream();
MS> TPngImage *png = new TPngImage();
MS> BytesToRaw(AData,msR,AData.Length); // проблемое место
msR->>Position = soFromBeginning;
png->>LoadFromStream(msR);
MS> Image2->Picture->Graphic = png;
MS> delete png, msR;
MS> png = NULL, msR = NULL;
MS>}
MS>Картинка появляется в Image2, но при закрытии формы возникает Access Violation.
MS>Функция BytesToRaw в третьем параметре требует int Size. Я передаю ей размер полученных данных (AData.Length) получаю всё тот же AV.
MS>Пробую передать размер TBytes (пробовал также для TByteDynArray):
MS>BytesToRaw(AData,msR,sizeof(AData));
MS>В этом случае поток msR имеет нулевую длину и ссылается в NULL
MS>Пробовал работать с этой функцией без сетевой передачи (далее изменённый код OnClick для Button1):
MS> TMemoryStream *msS = new TMemoryStream();
MS> TPngImage *png = new TPngImage();
png->>Assign(Image1->Picture);
png->>SaveToStream(msS);
msS->>Position = soFromBeginning;
MS> TByteDynArray DynArray = RawToBytes(msS,msS->Size);
MS> BytesToRaw(DynArray,msS,sizeof(DynArray));
msS->>Position = soFromBeginning;
png->>LoadFromStream(msS);
MS> mage2->Picture->Graphic = png;
MS> delete png, msS;
MS> png = NULL, msS = NULL;
MS>Тогда ошибок не возникает.
MS>Подскажите пожалуйста, что я делаю неправильно?
функции RawToBytes и BytesToRaw предназначены для простого копирования структуры в/из массив/а.
Внутри просто стоит memcpy.
в Вашем случае нужно использовать
WriteTIdBytesToStream и ReadTIdBytesFromStream;