кто как реализует разбор пакетов?
мне пока что в голову ничего лучше не приходит (кусок исходника джава сервера):
Код:
switch (opcode)
{
case 0x00:
msg = new Logout();
break;
case 0x0c:
msg = new CharacterCreate();
break;
case 0x0d:
msg = new CharacterDelete();
break;
case 0x12:
msg = new CharacterSelect();
break;
case 0x13:
msg = new NewCharacter();
break;
}
__________________
C++Builder 6, Delphi 7, RAD Studio XE2, MS VC++...
memcpy() копирует массив в массив.
а мне нужно кусок массива в DWORD например..
или кусок массива в widestring, причем с четким определением его длины, чтобы потом было понятно с какого места продолжать чтение пакета.
потому что длина отводимая под ник/титул изменяется в пакете в зависимости от количества символов в нике/титуле...
ник/титул добивается нулями до длины 16/32 байта.
__________________
C++Builder 6, Delphi 7, RAD Studio XE2, MS VC++...
кстати додумался как круче делать - string(pchar(@pck[байт с которого идёт строка]));
кто-нить видит подводные камни?
widestring(pwidechar(@pck[байт с которого идёт строка]));
или
string(PWideToString(pwidechar(@pck[байт с которого идёт строка])));
хотя я делал так
widestring(pwidechar(Pointer(DWORD(ppck)+[байт с которого идёт строка]))));
string(PWideToString(pwidechar(Pointer(DWORD(ppck) +[байт с которого идёт строка]))));
где ppck это адрес пакета
Цитата:
function PWideToString(pw: PWideChar): string;
var
p: PChar;
iLen: integer;
begin
iLen := lstrlenw(pw) + 1;
GetMem(p, iLen);
WideCharToMultiByte(CP_ACP, 0, pw, iLen, p, iLen * 2, nil, nil);
Result := p;
FreeMem(p, iLen);
end;
__________________
каждый раз, когда ты пишешь int i вместо short i, сотни пользователей вынуждены докупать планку памяти
служба поддержки 4gay - ICQ 642274822
Последний раз редактировалось Morfik, 11.01.2012 в 04:44.