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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2014, 19:16   #1
Pykhov
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 20
По умолчанию Из байтового массива в запись

Считываю данные с прибора в массив byteR и побайно переношу в запись
Код:
  Tanswer = Packed Record
    idT:Word;
    idP:Word;
    length:Word;
    address:byte;
    fun:byte;
    error:byte;
    Data:array[0..255] of word;
    //Data:array[0..255] of single;
  end;

 var
   byteR:array [0..255]of byte;
   PAnswer:Tanswer;


Cli.Socket.ReceiveBuf(byteR, sizeof(byteR));
  PAnswer.idT:=byteR[0];
  PAnswer.idT:=PAnswer.idT shl 8;
  PAnswer.idT:=PAnswer.idT+byteR[1];
  PAnswer.idP:=byteR[2];
  PAnswer.idP:=PAnswer.idP shl 8;
  PAnswer.idP:=PAnswer.idP+byteR[3];
  PAnswer.length:=byteR[4];
  PAnswer.length:=PAnswer.length shl 8;
  PAnswer.length:=PAnswer.length+byteR[5];
  PAnswer.address:=byteR[6];
  PAnswer.fun:=byteR[7];
  PAnswer.error:=byteR[8];
  for i := 0 to ((PAnswer.length-2)div 2) do
    begin
      PAnswer.Data[i]:=byteR[9+i*2];
      PAnswer.Data[i]:=PAnswer.Data[i] shl 8;
      PAnswer.Data[i]:=PAnswer.Data[i]+byteR[9+i*2+1];
    end;
Данный код работает но не нравится как его реализовал ).

Последний раз редактировалось Pykhov; 10.02.2014 в 20:19.
Pykhov вне форума Ответить с цитированием
Старый 10.02.2014, 19:41   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

ReceiveBuf(PAnswer, sizeof(Tanswer ));
или
ReceiveBuf(PAnswer.idT, sizeof(PAnswer.idT));
ReceiveBuf(PAnswer.idP, sizeof(PAnswer.idP));
ReceiveBuf(PAnswer.length, sizeof(PAnswer.length));
...
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 10.02.2014 в 19:46.
Slym вне форума Ответить с цитированием
Старый 10.02.2014, 19:50   #3
Pykhov
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
ReceiveBuf(PAnswer, sizeof(Tanswer ));
или
ReceiveBuf(PAnswer.idT, sizeof(PAnswer.idT));
ReceiveBuf(PAnswer.idP, sizeof(PAnswer.idP));
ReceiveBuf(PAnswer.length, sizeof(PAnswer.length));
...
Не работает всякая хрень вылвзит
Pykhov вне форума Ответить с цитированием
Старый 10.02.2014, 20:17   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Считываю данные с прибора в массив byteR и побайно переношу в запись
Убей не вижу где считывание в массив byteR.
Более того на первый взгляд нужно оставить в коде только строчку
Код:
Cli.Socket.ReceiveBuf(PAnswer, sizeof(PAnswer));
а всё что после нее просто выбросить в помойку.

Последний раз редактировалось northener; 10.02.2014 в 20:20.
northener вне форума Ответить с цитированием
Старый 10.02.2014, 20:20   #5
Pykhov
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 20
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Убей не вижу где считывание в массив byteR.
Извеняюсь при редактирование не то вставил
Cli.Socket.ReceiveBuf(byteR, sizeof(byteR));


Cli.Socket.ReceiveBuf(PAnswer, sizeof(PAnswer));получаю не тот результат

Последний раз редактировалось Pykhov; 10.02.2014 в 20:24.
Pykhov вне форума Ответить с цитированием
Старый 10.02.2014, 20:24   #6
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

big-endian
читаем http://ru.wikipedia.org/wiki/%CF%EE%...E0%E9%F2%EE%E2
Код:
ReceiveBuf(PAnswer, sizeof(Tanswer ));
swap(PAnswer.idT);...
АХ ДА... не забываем про переменную часть согласно PAnswer.length т.е. 2 раза ReceiveBuf

Код:
Tanswer = Packed Record
    idT:Word;
    idP:Word;
    length:Word;
    address:byte;
    fun:byte;
    error:byte;
  end;
Data:array[0..255] of word;
...
ReceiveBuf(PAnswer, sizeof(Tanswer ));
ReceiveBuf(Data, PAnswer.length);
Не стесняемся, плюсуем!

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запись массива Mariolka Паскаль, Turbo Pascal, PascalABC.NET 2 09.05.2013 15:33
Запись массива в файл Стремящийся Общие вопросы по Java, Java SE, Kotlin 12 26.06.2012 16:19
Как установить кодировку байтового потока? vedro-compota Общие вопросы .NET 9 06.01.2011 11:52
Запись байтов из массива Ultr164 Общие вопросы Delphi 6 05.01.2011 16:26
запись Массива в БД Chepa БД в Delphi 4 26.12.2006 18:58