Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Pointer to string  [new]
xarfan
Member

Откуда:
Сообщений: 2
Добрый день.
Возникла необходимость поддержки старого кода. Сам я на 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? Спасибо!
8 фев 20, 11:46    [22075935]     Ответить | Цитировать Сообщить модератору
 Re: Pointer to string  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4086
xarfan,

SetLength(RecivedStr, BufferLength);
Move(Buffer^, Pointer(ReciveStr)^, BufferLen);
8 фев 20, 12:01    [22075941]     Ответить | Цитировать Сообщить модератору
 Re: Pointer to string  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3523
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

Сообщение было отредактировано: 8 фев 20, 12:48
8 фев 20, 12:42    [22075951]     Ответить | Цитировать Сообщить модератору
 Re: Pointer to string  [new]
alekcvp
Member

Откуда:
Сообщений: 1849
Kazantsev Alexey
xarfan,

SetLength(RecivedStr, BufferLength);
Move(Buffer^, Pointer(ReciveStr)^, BufferLen);

SetString(RecivedStr, Buffer, BufferLen);

Разумеется, это всё справедливо для старых, не Unicode дельфи. Если 2009 и выше, то лучше использовать TBytes.

Сообщение было отредактировано: 8 фев 20, 13:09
8 фев 20, 13:08    [22075962]     Ответить | Цитировать Сообщить модератору
 Re: Pointer to string  [new]
xarfan
Member

Откуда:
Сообщений: 2
Kazantsev Alexey,
Благодарю за помощь!
8 фев 20, 13:16    [22075969]     Ответить | Цитировать Сообщить модератору
 Re: Pointer to string  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11498
alekcvp
Если 2009 и выше, то лучше использовать TBytes.
Или TRawString
10 фев 20, 15:28    [22076878]     Ответить | Цитировать Сообщить модератору
 Re: Pointer to string  [new]
alekcvp
Member

Откуда:
Сообщений: 1849
_Vasilisk_
alekcvp
Если 2009 и выше, то лучше использовать TBytes.
Или TRawString

И снова получить проблемы на нулях в строке...
10 фев 20, 16:00    [22076907]     Ответить | Цитировать Сообщить модератору
 Re: Pointer to string  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11498
alekcvp
И снова получить проблемы на нулях в строке...
Зачем? Строки вполне могут содержать нули. У автора проблема в касте к PChar. Вот этот каст, а вернее цепочка Pointer -> PChar -> String и обрезает строку. Сделать SetString и никаких проблем
10 фев 20, 16:18    [22076928]     Ответить | Цитировать Сообщить модератору
 Re: Pointer to string  [new]
Василий 2
Member

Откуда:
Сообщений: 960
Мб, RawByteString?
10 фев 20, 18:52    [22077098]     Ответить | Цитировать Сообщить модератору
 Re: Pointer to string  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11498
Василий 2
Мб, RawByteString?
Может. Не помню как точно тип называется.

Но это все придирки. Я обеими руками за
alekcvp
лучше использовать TBytes.
10 фев 20, 19:16    [22077122]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить