[Tutorial] Offsets de escrita/leitura - Pawn.RakNet
#1

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 valorBitsBytes
FLOAT324
(U)INT32324
(U)INT16162
(U)INT881
BOOL10,125
Entendendo isso, vamos levar em consideraзгo o seguinte:

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_UINT161,
    
PR_UINT322,
    
PR_UINT163,
    
PR_UINT84
); 
No bitstream acima, temos um total de 9 bytes, que sгo equivalentes a 72 bits, pois 8 bits = 1 byte.

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_bs64); 
Apуs haver ignorado os 64 bits que nгo temos intenзгo em ler, podemos ler o ъltimo parвmetro:

PHP код:
new var;
    
BS_ReadValue (
    
my_bs,
    
PR_UINT8, var
); 
Logo, apenas os ъltimos 8 bits vгo ser lidos.

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_bs64); 
Apуs haver mudado a offset de leitura para 64, podemos ler o ъltimo parвmetro:

PHP код:
new var;
    
BS_ReadValue (
    
my_bs,
    
PR_UINT8, var
); 
Assim como no primeiro exemplo, apenas os ъltimos 8 bits vгo ser lidos.

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_UINT161
);
BS_WriteValue (
    
my_bs,
    
PR_UINT322
);
BS_WriteValue (
    
my_bs,
    
PR_UINT163
);
BS_WriteValue (
    
my_bs,
    
PR_UINT84
); 
No exemplo acima, nуs escrevemos 72 bits no bitstream. Essa maneira й equivalente a:

PHP код:
new BitStream:my_bs BS_New();
BS_WriteValue (
    
my_bs,
    
PR_UINT161,
    
PR_UINT322,
    
PR_UINT163,
    
PR_UINT84
); 
Alguns RPCs tem estruturas bem longas, e poder escrever/ler seus parвmetros usando BS_WriteValue/BS_ReadValue mais de uma vez й algo beneficial, jб que temos um limite de 32 parвmetros por funзгo no Pawn.
Reply
#2

Bem explicado.
Reply
#3

Tуpico atualizado.
Reply
#4

Уtimo tutorial, me fez ter menos trabalho e aumento de desempenho em minhas includes, fazendo com que eu pudesse deslocar ao valor da offset sobre o pacote.

Reputaзгo adicionada.
Reply
#5

Quote:
Originally Posted by Cycle
Посмотреть сообщение
Уtimo tutorial, me fez ter menos trabalho e aumento de desempenho em minhas includes, fazendo com que eu pudesse deslocar ao valor da offset sobre o pacote.

Reputaзгo adicionada.
Obrigado.
Reply
#6

Tenho que confessar, assim que cai de paraquedas por aqui, de inicio jб me agradei com o tutorial. Semanas atrбs jб estava em busca de algo assim para fazer uma economia leal... Continue assim brother!
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)