PDA

Просмотр полной версии : struct NetworkPacket


Elecktron
10.12.2011, 17:22
struct NetworkPacket
{
unsigned char id, _padding1, exid, _padding2;
unsigned short size, _padding3;
unsigned char * data;
};

id, exid - айди пакета.
size - размер пакета.
data - данные? как их получить?
_padding - что это?

wsprintfA(buf, "Packet id=0x%x, size=0x%x, data=%x", packet->id, packet->size, packet->data);

вот так в лог пишется только семь байт...

supernewbie
10.12.2011, 17:36
PNetworkPacket = ^TNetworkPacket;
TNetworkPacket = packed record
id: byte; // ID пакета
res: byte; // тут ничего нужного нет
id2: Smallint; // второй ID если есть
size: Smallint; // размер данных
res2: Smallint;
data: array of byte; // указатель на данные
end;

Morfik
10.12.2011, 17:44
struct NetworkPacket
{
unsigned char id, _padding1, exid, _padding2;
unsigned short size, _padding3;
unsigned char * data;
};

id, exid - айди пакета.
size - размер пакета.
data - данные? как их получить?
_padding - что это?

wsprintfA(buf, "Packet id=0x%x, size=0x%x, data=%x", packet->id, packet->size, packet->data);

вот так в лог пишется только семь байт...

_padding это мусор

data - данные? как их получить?
unsigned char * data;

data это указатель (адресс) где лежат твои данные размером size

for (int i=0;i<size;i++)
{
printf("%x ",data[i]);//выводим по байту
или
printf("%x ",*data[i]);//выводим по байту
}

синтаксис си по указателям не оч помню

Elecktron
10.12.2011, 19:58
пробую так:
for (int i=0;i<packet->size;i++)
{
wsprintfA(buf, "",packet->data[i]);
"функция сохранения в файл"(buf);
}
сохраняет какуюто невменяемую билиберду:

Packet id=0x0, size=0xb7, data=6b636150
Packet id=0x1, size=0xf, data=6b636150

Morfik
10.12.2011, 20:23
wsprintfA(buf, "",packet->data[i]);

а указать в каком виде сохраняем...
wsprintfA(buf, "%x",packet->data[i]);

а может и ваще надо wsprintfA(buf, "%x",LPVOID(DWORD(packet->data)+i));

погугли работу с указателями, главной пойми packet->data это адресс в памяти где лежит содержимое пакета

Elecktron
10.12.2011, 21:14
спасибо заработало.
я провтыкал %х :)
осталось "нули повыравнивать", чтобы в логе красиво было..

for (int i=0;i<packet->size;i++)
{
wsprintfA(buf, "%x",packet->data[i]);
"функция сохранения в файл"(buf);
"функция сохранения в файл"(" ");
}

кусок лога:


Packet id=0xfe, size=0x7c
7 0 0 0 1 0 0 0 67 0 6c 0 75 0 64 0 69 0 6f 0 0 0 2 0 0 0 64 0 69 0 6f 0 6e 0 0 0 3 0 0 0 67 0 69 0 72 0 61 0 6e 0 0 0 4 0 0 0 6f 0 72 0 65 0 6e 0 0 0 5 0 0 0 61 0 64 0 65 0 6e 0 0 0 6 0 0 0 69 0 6e 0 6e 0 61 0 64 0 72 0 69 0 6c 0 65 0 0 0 7 0 0 0 67 0 6f 0 64 0 61 0 72 0 64 0 0 0 0 0

ALF
14.12.2011, 17:02
#pragma pack(push, 1)
struct NetworkPacket
{
unsigned char Id, _padding1, exid, _padding2;
unsigned short size, _padding3;
unsigned char* data;
};
#pragma pack(pop)


char* data - УКАЗАТЕЛЬ на данные

void __stdcall NetworkPacketDump( NetworkPacket* np )
{
int Id = np->Id;
switch (Id)
{
case 0x19: //npcHtmlMessage
{
DumpHtml((NpcHtmlMessage *)(np->data));
}
case 0x0C: //NpcInfo
{
ParseNpc((NpcInfo *)(np->data));
}
}
return;
}