Java の SOCKS アドレス内の負の数は負の IP ではない
Java の byte API で SOCKS アドレスのフィールドを解析するときは、符号なしのプロトコル値として読んでください。
Java の byte は符号付きです。そのため、ワイヤ上の値が 217 のオクテットは、バイト配列から直接出力すると負の値として見えることがあります。これは、プロキシが無効な負の IP アドレスを送ったという意味ではありません。
保存された値は、たとえば Byte.toUnsignedInt(value) を使って符号なし整数に変換するか、フィールドを読み取るときに DataInputStream.readUnsignedByte() を使用してください。ネットワークバイト順のポートでは、どちらかのバイトを符号付きの 10 進数として扱うのではなく、仕様に定められた 2 バイトの値を読んでください。
表現とフレーミングも分けて考えてください。ソケットの読み取りは、要求したより少ないバイト数しか返さないことがあります。フィールド全体を読み切ってから、SOCKS のバージョンとアドレスの種類に従って解釈します。SOCKS5 のアドレスには IPv4 アドレス、IPv6 アドレス、または長さプレフィックス付きのドメイン名が入ります。固定の 4 バイトという前提は、そのうち 1 つの形式しか扱えません。
負に見えるオクテットを修正しても、表示上の問題が直るだけです。誤ったオフセットから読み始めたパーサーや、アドレスの途中で止まったパーサーは直りません。