Trong Java, byte có dấu. Vì vậy một octet có giá trị trên đường truyền là 217 có thể hiện ra như một giá trị âm khi in trực tiếp từ mảng byte. Điều đó không có nghĩa là proxy đã gửi một địa chỉ IP âm không hợp lệ.

Chuyển giá trị đã lưu sang số nguyên không dấu, ví dụ bằng Byte.toUnsignedInt(value), hoặc dùng DataInputStream.readUnsignedByte() khi đọc trường này. Với cổng theo thứ tự mạng, hãy đọc giá trị hai byte đã được tài liệu hóa thay vì coi một trong hai byte là số thập phân có dấu.

Cũng cần tách cách biểu diễn khỏi cách đóng khung. Một lần đọc socket có thể trả về ít byte hơn yêu cầu. Hãy đọc trọn trường, rồi diễn giải theo phiên bản SOCKS và loại địa chỉ. Địa chỉ SOCKS5 có thể chứa địa chỉ IPv4, địa chỉ IPv6 hoặc tên miền có tiền tố độ dài; giả định cố định bốn byte chỉ bao trùm một trong các dạng đó.

Sửa một octet trông có vẻ âm sẽ giải quyết vấn đề hiển thị. Nhưng nó không sửa được bộ phân tích đã bắt đầu đọc sai vị trí hoặc dừng giữa chừng địa chỉ.

Bài viết liên quan