从套接字以小端字节顺序读取无符号整数

时间:2014-06-06 07:30:12

标签: java sockets endianness

我正在尝试连接到vortex.labs.overthewire.org上的端口5842并以主机字节顺序读取4个无符号整数。服务器vortex.labs.overthewire.org是在32位x86机器上(意思是,一个小端)建筑) 在Java中它可以是这样的吗?

Socket socket = new Socket("vortex.labs.overthewire.org", 5842 );
InputStream in = socket.getInputStream();
int c;
while((c=in.read())!=-1){
  System.out.println((byte)c);
}

2 个答案:

答案 0 :(得分:2)

整数可能会从32位系统发送为四字节值。因此,您需要将四个字节读入数组,然后将其转换为int:

Socket socket = new Socket("vortex.labs.overthewire.org", 5842);
DataInputStream in = new DataInputStream(socket.getInputStream());

byte[] intData = new byte[4];

for (int i = 0; i < 4; i++) {
    in.readFully(intData);
    System.out.println(ByteBuffer.wrap(intData)
            .order(ByteOrder.LITTLE_ENDIAN).getInt());
}

相关:How can I convert a 4-byte array to an integer?

答案 1 :(得分:0)

你是正确的方式。你提到你想读4个整数。也许最好使用for循环:

byte[] bytes;
for (int i=0; i<4; i++) {
    bytes = new byte[4];
    for (int j=0; j<4; j++) {
        bytes[j] = (byte) in.read();
    }
    int x = java.nio.ByteBuffer.wrap(bytes).order(java.nio.ByteOrder.LITTLE_ENDIAN).getInt();
    System.out.println(x);
}

另外,请勿忘记close输入流。