![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить данные, имея только указатель на них? [D7, WinXP]
Peter3 © (2005-07-30 18:47:00)есть функция, она получает данные по сети в определенный буфер.
я никак не пойму, как мне получить данные содержащиеся в буфере?
пытаюсь так:
function recv(s: TSocket; var Buf; len, flags: integer): integer
var MyBuf: string;
begin
MyBuf := Copy(PChar(@Buf),1,len);
end;
при этом в MyBuf пишутся только первые 4 байта из полученных данных. Покажите пожалуйста как надо.
Defunct (2005-07-30 22:05:00) [1]> Peter3
Какая-то галиматья.. Зачем copy и move вообще?
что мешает просто использовать:
Socket.ReadBuffer( <мой буфер>, <переменная в которую запишется длина (в байтах) принятых данных> )
Peter3 (2005-07-30 19:28:00) [2]понял, спасибо вам
begin...end (2005-07-30 19:23:00) [3]> Peter3 (30.07.05 19:20) [11]
Тогда см. [10]. Однако имейте в виду, что, если в передаваемых данных встретится нулевой символ, то Вы увидите не всё содержимое буфера, когда выведете строку MyBuf на экран (например, с помощью ShowMessage).
Peter3 (2005-07-30 19:20:00) [4]Да. так. Я хочу поместить их в строку чтобы посмотреть, что я получаю. Когда делал копировал данные через Copy, то действительно получал 4 первых и нужных байта как они и есть в пакете. но пакет длиннее, потому что параметр len больше 4. Я понял про указатель, но не понял как все данные вытащить по нему.
kami (2005-07-30 19:19:00) [5]Не... не хочу уходить :)
var
MyBuf:string;
begin
SetLength(MyBuf,len);
Move(buf,MyBuf[1],len);
//========
Вот так - получается, только что посмотрел
begin...end (2005-07-30 19:16:00) [6]> Peter3 (30.07.05 19:09) [7]
Ясно. Тогда я попробую сформулировать задачу, а Вы скажете, правильно ли я её понял.
В виде параметра Buf приходят данные, их длина в байтах передаются в параметре len, и нужно поместить эти данные в тело строки MyBuf.
Так?
P.S. Правда, я не уверен, что их нужно поместить именно в СТРОКУ.
Peter3 (2005-07-30 19:10:00) [7]я так и не понял как мне получить данные))
Peter3 (2005-07-30 19:09:00) [8]BufData это MyBuf
просто переменные переименовал, это и есть полный код %)
kami (2005-07-30 19:06:00) [9]ЭЭЭ... че-то глупость спорол :)))
Надо, наверное, заканчивать с Delphi на сегодня и поиграться во что-нибудь...
begin...end (2005-07-30 19:06:00) [10]> Peter3 (30.07.05 19:00) [3]
Что такое BufData? Представьте полный код.
Кстати, приведение к PChar здесь не нужно.
kami (2005-07-30 19:03:00) [11]If Count specifies more characters or array elements than are available, only the characters or elements from S[Index] to the end of Sare returned.
@Buf=pointer, то есть 4 байта - что и следовало доказать.
MyBuf:=Copy(PChar(Buf{ или даже buf^}),0,len);// хотя, не уверен - т.к. много пива не бывает :)
Peter3 (2005-07-30 19:00:00) [12]да это нетипизированный параметр.
сорри за глупый вопрос, а как правильно в этом случае использовать Move?
так у меня не работает:
Move(PСhar(Buf),BufData,len);
debuger (2005-07-30 18:59:00) [13]зачем собака перед buf? это также как PChar является указателем.
Т.е. то что ты зделал, это взял адрес(4б) указателя Buf и куда-то скопил...
begin...end (2005-07-30 18:52:00) [14]Вероятно, Buf -- это и есть данные. Нетипизированный параметр.
Если нужно скопировать эти данные, используйте процедуру Move.