08.04.2018, 18:08
(
Последний раз редактировалось BrunoBM23; 17.08.2018 в 16:37.
)
Offsets de escrita/leitura - Pawn.RakNet
Jб vi o pessoal tendo dъvidas em questгo das offsets de escrita e leitura no bitstream de um pacote, entгo resolvi criar este tutorial.
Antes que possamos entender como isso funciona e quais seriam as offsets de cada parвmetro em um RPC ou pacote, temos que entender primeiramente quantos bits/bytes cada tipo de valor й equivalente. Abaixo, temos uma pequena tabela com essa informaзгo:
Tipo de valor | Bits | Bytes |
FLOAT | 32 | 4 |
(U)INT32 | 32 | 4 |
(U)INT16 | 16 | 2 |
(U)INT8 | 8 | 1 |
BOOL | 1 | 0,125 |
Offset de leitura/escrita de um parвmetro = Soma da quantidade de bits do tipo de valor dos parвmetros anteriores.
Jб tendo levado em consideraзгo a informaзгo acima, vamos para um exemplo:
PHP код:
new BitStream:my_bs = BS_New();
BS_WriteValue (
my_bs,
PR_UINT16, 1,
PR_UINT32, 2,
PR_UINT16, 3,
PR_UINT8, 4
);
Vamos supor que queremos ler o valor do ъltimo parвmetro, que й 4 e tem o tipo UINT8. Existem duas maneiras de ler esse valor, que seriam utilizando BS_SetReadOffset para mudar a offset de leitura, ou usando BS_IgnoreBits para ignorar os outros bits e ler apenas os ъltimos 8.
Entгo levando em consideraзгo que com a soma da quantidade de bits do tipo de valor dos parвmetros anteriores vamos chegar atй as offsets do parвmetro que queremos, vamos fazer o seguinte:
Exemplo 1 - BS_IgnoreBits
Somando os bits dos parвmetros anteriores ao ъltimo, vamos chegar a 64 bits (16 + 32 + 16). Esses 64 bits sгo o nъmero que vamos ignorar, usando a funзгo da seguinte maneira:
PHP код:
BS_IgnoreBits(my_bs, 64);
PHP код:
new var;
BS_ReadValue (
my_bs,
PR_UINT8, var
);
Exemplo 2 - BS_SetReadOffset
A lуgica й a mesma, nуs vamos somar os bits dos parвmetros anteriores ao ъltimo, logo, vamos mudar as offsets de leitura para 64:
PHP код:
BS_SetReadOffset(my_bs, 64);
PHP код:
new var;
BS_ReadValue (
my_bs,
PR_UINT8, var
);
Leve em consideraзгo que a mesma lуgica se aplica para offsets de escrita. Assim como temos as funзхes BS_SetReadOffset, BS_GetReadOffset e BS_ResetReadPointer para leitura, temos BS_SetWriteOffset, BS_GetWriteOffset e BS_ResetWritePointer para escrita, enfim, essas funзхes fazem o seguinte:
BS_SetWriteOffset - Muda as offsets de escrita.
BS_GetWriteOffset - Obtйm a offset de escrita atual.
BS_ResetWritePointer - "Reseta" as offsets de escrita, mudando para 0.
BS_SetReadOffset - Muda as offsets de leitura.
BS_GetReadOffset - Obtйm a offset de leitura atual.
BS_ResetReadPointer - "Reseta" as offsets de leitura, mudando para 0.
Sobre a escrita/leitura de dados
O pessoal acha que vocк estб limitado a ler/escrever os dados usando a funзгo BS_WriteValue/BS_ReadValue uma ъnica vez, mas isso nгo й verdade. Como explicado acima, um bitstream tem offsets de leitura e escrita, e essa й a maneira utilizada para saber em qual offset vocк se encontra, logo, o seguinte tambйm й possнvel:
PHP код:
new BitStream:my_bs = BS_New();
BS_WriteValue (
my_bs,
PR_UINT16, 1
);
BS_WriteValue (
my_bs,
PR_UINT32, 2
);
BS_WriteValue (
my_bs,
PR_UINT16, 3
);
BS_WriteValue (
my_bs,
PR_UINT8, 4
);
PHP код:
new BitStream:my_bs = BS_New();
BS_WriteValue (
my_bs,
PR_UINT16, 1,
PR_UINT32, 2,
PR_UINT16, 3,
PR_UINT8, 4
);