powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Pointer to string
10 сообщений из 10, страница 1 из 1
Pointer to string
    #39924155
xarfan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Возникла необходимость поддержки старого кода. Сам я на Delphi не писал, поэтому все сложно:

Имеется компонент Comm32. У него есть событие
ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word).
Далее var RecivedStr: string и RecivedStr:=PChar(Buffer), после анализируем что пришло на com-порт

Изменился опрашиваемый прибор и теперь, в ответе от прибора присутствует нулевой символ. Как я понимаю, при загрузке его в RecivedStr строка заканчивается и в ней остается только то, что было до нулевого символа, все остальное отбрасывается.
Т.е. по порту пришло:
Read data (COM4) 40 03 06 00 00 08 12 00 00 bf 43 (@........їC), а в RecivedStr только первые 3 символа.

Как правильно прочитать Buffer? Спасибо!
...
Рейтинг: 0 / 0
Pointer to string
    #39924159
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xarfan,

Код: pascal
1.
2.
SetLength(RecivedStr, BufferLength);
Move(Buffer^, Pointer(ReciveStr)^, BufferLen);
...
Рейтинг: 0 / 0
Pointer to string
    #39924166
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xarfan,

всё сложно, потому что сделано плохо - использовать строки как буферы так себе идея. переписав на массив байт гарантированно получишь все данные в любой версии делфи. ну а как от байтов к строкам перейти уже нужно смотреть на версию delphi.
вот ссылки для ознакомления с вариантами (не всеми):
https://www.sql.ru/forum/698354/perevod-tbytes-v-stroku
https://www.sql.ru/forum/1200089/kak-stroku-sohranit-v-massiv-bayt-i-prochitat-ee-obratno
...
Рейтинг: 0 / 0
Pointer to string
    #39924173
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
xarfan,

Код: pascal
1.
2.
SetLength(RecivedStr, BufferLength);
Move(Buffer^, Pointer(ReciveStr)^, BufferLen);


Код: pascal
1.
SetString(RecivedStr, Buffer, BufferLen);


Разумеется, это всё справедливо для старых, не Unicode дельфи. Если 2009 и выше, то лучше использовать TBytes.
...
Рейтинг: 0 / 0
Pointer to string
    #39924177
xarfan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey,
Благодарю за помощь!
...
Рейтинг: 0 / 0
Pointer to string
    #39924704
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Если 2009 и выше, то лучше использовать TBytes.
Или TRawString
...
Рейтинг: 0 / 0
Pointer to string
    #39924725
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
alekcvp
Если 2009 и выше, то лучше использовать TBytes.
Или TRawString

И снова получить проблемы на нулях в строке...
...
Рейтинг: 0 / 0
Pointer to string
    #39924739
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
И снова получить проблемы на нулях в строке...
Зачем? Строки вполне могут содержать нули. У автора проблема в касте к PChar. Вот этот каст, а вернее цепочка Pointer -> PChar -> String и обрезает строку. Сделать SetString и никаких проблем
...
Рейтинг: 0 / 0
Pointer to string
    #39924864
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мб, RawByteString?
...
Рейтинг: 0 / 0
Pointer to string
    #39924886
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
Мб, RawByteString?
Может. Не помню как точно тип называется.

Но это все придирки. Я обеими руками за
alekcvp
лучше использовать TBytes.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Pointer to string
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]