In Java byte è con segno. Un ottetto il cui valore sul filo è 217 può quindi apparire come valore negativo quando viene stampato direttamente da un array di byte. Ciò non significa che il proxy abbia inviato un indirizzo IP negativo non valido.

Convertire il valore memorizzato in un intero senza segno, ad esempio con Byte.toUnsignedInt(value), oppure usare DataInputStream.readUnsignedByte() durante la lettura del campo. Per una porta in ordine di rete, leggere il valore a due byte documentato invece di trattare uno dei due byte come numero decimale con segno.

Separare anche la rappresentazione dall'incapsulamento. Una lettura dal socket può restituire meno byte del richiesto. Leggere il campo completo, poi interpretarlo in base alla versione SOCKS e al tipo di indirizzo. Gli indirizzi SOCKS5 possono contenere un indirizzo IPv4, un indirizzo IPv6 o un nome di dominio con prefisso di lunghezza; l'ipotesi fissa di quattro byte copre solo una di queste forme.

Correggere un ottetto che sembra negativo risolve il problema di visualizzazione. Non corregge un parser che ha iniziato a leggere con un offset errato o si è fermato a metà dell'indirizzo.

Articoli correlati