Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2013, 19:36   #1
MatrixGru
 
Регистрация: 20.10.2013
Сообщений: 4
По умолчанию Запись данных в структуру

Не получается разобрать поступающие данные с устройства...

Структура данных такова:
Поле | Размер
Заголовок 0x01 | 1 байт
Длина пакета | 2 байта
Тэг 1 | 1 байт
Данные, соответствующие тэгу 1 зависит от типа тэга


Я создал такую запись и пытаюсь присвоить ей приходящие данные, но что то не так....
Код:
type
THEAD = packed Record
header: Byte;
len: Word;
tag:Byte;
end;

...

var
HEAD:THEAD;
begin
buffer := Socket.ReceiveText;

HEAD:=buffer; //ВОт здесь что то не так. Несоответствие типов, оба типа по 4 байта... Понимаю что не верно, но как правильно будет...???


end;

Помогите. Спасибо!

Последний раз редактировалось Stilet; 21.10.2013 в 11:58.
MatrixGru вне форума Ответить с цитированием
Старый 20.10.2013, 20:10   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
var
HEAD:THEAD;
begin
buffer := Socket.ReceiveText;

HEAD:=buffer; //ВОт здесь что то не так.
Конечно - не так! ВЫ получаете текст, а потом говорите компилятору "сам разбирайся".

По памяти надо:
ReciveBuf(HEAD, SizeOf(THEAD)); как-то так. С Сервера так же НЕ текст должен идти.
Человек_Борща вне форума Ответить с цитированием
Старый 20.10.2013, 20:56   #3
MatrixGru
 
Регистрация: 20.10.2013
Сообщений: 4
По умолчанию

Приходят данные: ЂБ8682040054149242

Но при заполнении моей структуры и после вывода, все по нулям... что то нет так может описал...
MatrixGru вне форума Ответить с цитированием
Старый 21.10.2013, 07:13   #4
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Цитата:
Сообщение от MatrixGru Посмотреть сообщение
Приходят данные: ЂБ8682040054149242

Но при заполнении моей структуры и после вывода, все по нулям... что то нет так может описал...
в Hex давай... поле длинна заголовка не соответствует пакету (большое)
Код:
var
  Buf:PAnsiChar;
  len:Integer;
  Hex:AnsiString;
begin
  len:=Socket.ReceiveLength;
  GetMem(Buf,len);
  Socket.ReceiveBuf(Buf^,len);
  SetLength(Hex,len*2);
  BinToHex(Buf,PAnsiChar(@Hex[1]),len);
  Caption:=Hex;
end;
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 21.10.2013 в 08:23.
Slym вне форума Ответить с цитированием
Старый 21.10.2013, 08:22   #5
MatrixGru
 
Регистрация: 20.10.2013
Сообщений: 4
По умолчанию

Вроде разобрался со всем...

А имеется способ, сначала получить данные в промежуточную переменную, как я выше писал : buffer := Socket.ReceiveText; ????
А после полученными данными заполнить запись... Т.к. у меня есть еще одна запись очень большой размерности (70 полей), а через сокет не все сразу приходит, а по частям. Думаю сначала все получить а после в запись упихать и дальше работать ....
MatrixGru вне форума Ответить с цитированием
Старый 21.10.2013, 08:45   #6
MatrixGru
 
Регистрация: 20.10.2013
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
в Hex давай... поле длинна заголовка не соответствует пакету (большое)
Код:
var
  Buf:PAnsiChar;
  len:Integer;
  Hex:AnsiString;
begin
  len:=Socket.ReceiveLength;
  GetMem(Buf,len);
  Socket.ReceiveBuf(Buf^,len);
  SetLength(Hex,len*2);
  BinToHex(Buf,PAnsiChar(@Hex[1]),len);
  Caption:=Hex;
end;
Вот что в HEX вывелось: 011780011102C1033836383230343030353 43134393234043200F83E
MatrixGru вне форума Ответить с цитированием
Старый 21.10.2013, 10:30   #7
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Цитата:
Сообщение от MatrixGru Посмотреть сообщение
Вот что в HEX вывелось: 011780011102C1033836383230343030353 43134393234043200F83E
длинна пакета 1780 - много
если длинна 17 - нормально = 23, т.е. поле длинна 1 байт а заголовок 5 байт
Код:
THEAD = packed Record
header,len,tag: Byte;
dummy: word;
end;
для простоты промежуточную переменную TMemoryStream, хотя я бы делал в блокирующем режиме и все хранил в стеке как угодно
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 21.10.2013 в 10:36.
Slym вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++]Запись в структуру из файла Aero93 Помощь студентам 1 11.07.2012 16:17
Чтение из файла и запись в структуру. asmars Общие вопросы C/C++ 3 06.04.2012 19:04
С++.Ввод данных в структуру. Bullrock Помощь студентам 1 03.04.2012 13:55
Импорт данных из текстового файла в структуру glinin Общие вопросы C/C++ 1 20.10.2011 08:35
[C++|Builder] Задача на структуру данных conqueror Помощь студентам 3 17.01.2009 14:25