Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/37: Рейтинг темы: голосов - 37, средняя оценка - 4.76
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540

BytesToRaw (Indy 10)

21.06.2010, 19:48. Показов 7542. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, уважаемые коллеги.

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

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

Настраиваю компоненты:
C++
1
2
3
4
UDPServer->DefaultPort = 2050;
UDPClient->Port = 2050;
UDPClient->Host = "127.0.0.1";
UDPServer->Active = true;
В событии OnClick для Button1 выполняю передачу объекта серверу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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):
C++
1
BytesToRaw(AData,msR,sizeof(AData));
В этом случае поток msR имеет нулевую длину и ссылается в NULL

Пробовал работать с этой функцией без сетевой передачи (далее изменённый код OnClick для Button1):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  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;
Тогда ошибок не возникает.

Подскажите пожалуйста, что я делаю неправильно?
2
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.06.2010, 19:48
Ответы с готовыми решениями:

Indy 8 и Indy 10. Старая и новая версия
Есть строчки var c: char; myFile: file; HasChild: bool; s,RecvBuf,path: string; sr,srChild: TSearchRec; CRC,MasterCRC:...

Indy
начал читать книгу "Книга Indy in Depth. Глубины Indy" там пример with IndyClient do begin Connect; Try WriteLn('Hello World.'); ...

indy 10
Поставил indy 10,так как был необходим модyль IdAttachmentFile,но как оказалось после yстановки в 10 инди его тоже НЕТ,с чем это может...

1
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
23.06.2010, 13:57  [ТС]
Проблема с приёмом/передачей решена.

Для преобразования TBytes в TStream необходимо использовать функцию WriteTIdBytesToStream (обратная ей функция - ReadTIdBytesFromStream).

Если кому-то пригодится (а точно пригодится), в верхнем исходнике необходимо заменить две строчки.

В событии OnClick меняем девятую строчку на:
C++
1
2
TByteDynArray DynArray;
ReadTIdBytesFromStream(msS,DynArray,msS->Size);
А в событии OnUDPRead меняем седьмую строчку на:
C++
1
WriteTIdBytesToStream(msR,AData,AData.Length,0);
Теперь необходимо только реализовать разбивку потока на максимально возможные пакеты (UDPClient->BufferSize)
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.06.2010, 13:57
Помогаю со студенческими работами здесь

Книга по Indy
Какие есть книги по Indy, в которых учат свободно делать собственные чаты и авторизироваться на сайтах, т. к. подобной литературы я не...

Indy и HTTPS
Добрый день. Необходимо отправлять POST запрос на https ресурс. Решил реализовывать через indy. Но программа выдает ошибки в этапе работы...

Indy client
Здравствуйте, пишу на c++. кто-нибудь может разобраться с Indy Clients в BorlandC++6 перерыл гугл никакой документации для c++ нет....

Get Запрос в Indy
День добрый. Вопрос такой при Get запросе данные сразу заносятся в память или частями? пример TMemoryStream *zapros = new ...

Indy модули
проблема в трех картинках Как решить?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru