Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив байт 
:(
    Опции темы
<Spawn>
Дата 7.11.2003, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



При идентификации пакета хочу в зависимости от его заголовка устанавливать указатель на эти данные, для легкого доступа к данным пакета, но возникла одна странность:

Код
// Вот к примеру структура списка серверов
PGameServerList = ^TGameServerList;

 TGameServerList = record
   Cmd: Byte;
   BlockSize: Word;
   SystemInfo: Byte;
   ServersCount: Word;
  end;


Для данной структуры могут быть такие значения пакета
Код
A8, 00, 2E, FF, 00, 01 ....


Тогда соответственно поля указателя на эти данные(PGameServerList) должны быть такими
Код
Cmd = A8;
BlockSize = 002E;
SystemInfo = FF;
ServerCount = 0001


Но почему то так не получается:

Код
procedure TfAnalyzer.GetServList(Buffer: TBytes);
var
pGSL:PGameServerList;
ParentNode:TTreeNode;
begin
 pGSL:= PGameServerList(@Buffer[0]);
 ParentNode:=tvStructs.Items.Add(nil, 'GameServerList');
 //Cmd дает верное значение - A8
 tvStructs.Items.AddChild(ParentNode, Format('Cmd = %d',[pGSL.Cmd]));
 // BlockSize дает значение смещенное на 1 байт и при этом перевернутое, от нужного, т.е. не 002E, а FF2E. Из за чего этоconfused.gif? Если же обратиться к элементам массива, то они содержат верные данные. В чем я ошибся?
 tvStructs.Items.AddChild(ParentNode, Format('BlockSize = %d',[pGSL.BlockSize]));
 tvStructs.Items.AddChild(ParentNode, Format('SystemInfo = %d',[pGSL.SystemInfo]));
 tvStructs.Items.AddChild(ParentNode, Format('ServersCount = %d',[pGSL.ServersCount]));  
end;

procedure TfAnalyzer.ShowStruct(Buffer: TBytes);
begin
 tvStructs.Items.Clear;
 if Assigned(Buffer) then
 begin
   case Buffer[0] of
     CMD_SERVER_LIST: GetServList(Buffer);
     ...  
    end;
 end;
end;




--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
stab
Дата 7.11.2003, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



попробуй описать так:

Код

TGameServerList = packed record
  Cmd: Byte;
  BlockSize: Word;
  SystemInfo: Byte;
  ServersCount: Word;
 end;



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
stab
Дата 7.11.2003, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



А то что значения перевернутые так это особенность хранения данных в x86 архитектуре, т.е. если в памяти $01 $02, то при обращении к этому как к word, в word будет $0201.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
<Spawn>
Дата 11.11.2003, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



cully Спасибо, packed record вроде подходит для этого. А нельзя ли какими нить стандартными способамии "перевернуть" данные?

Это сообщение отредактировал(а) <Spawn> - 11.11.2003, 15:17


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Ars
Дата 11.11.2003, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

Репутация: нет
Всего: 2



Можно воспользоваться сокетовскими функциями htonl, htons, ntohl, ntohs, но это изврат smile.gif


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
<Spawn>
Дата 11.11.2003, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Ars Я знаю это)) Но это, как ты уже заметил, изврат. Проще такие функции самому сделать. Я имею ввиду есть ли возможность указать проге как она должна воспринимать данные?


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Ars
Дата 11.11.2003, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

Репутация: нет
Всего: 2



Это уже особенности платформенной архитектуры и программно не изменяются.


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
Dmitry V.Abramov
Дата 11.11.2003, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 30.9.2003
Где: Saint-Petersburg

Репутация: 5
Всего: 4



Цитата
cully А нельзя ли какими нить стандартными способамии "перевернуть" данные?

Можно. Поменяв процессор на работающий по принципу BIG-ENDIAN при распределении битовых полей. Motorolla 680x0, Power-PC к примеру...
--------------------
/DVA
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.