Java中的字节操作和数据报

时间:2015-08-13 15:05:02

标签: java int byte datagram

我正在尝试按如下方式编写握手类型消息,其中C = Client S = Server:

C-->S: "I'd like to talk" //session initiation 
S-->C: "80"  //(n, randomly generated number)
C-->S: "81"  //(n+1)
S: "does n= (n+1)-1?" //confirms the connection.

出于这个问题的目的,假设上面的逻辑是正确的。我希望我生成的随机数是32位数(即UDP数据报中发送的4个字节)。由于int是32位,我宁愿使用这种数据类型,但我似乎遇到了两个问题之一:

  1. 使用字节数组时,很容易发送数据报,但很难对32位数字执行简单的数学运算(例如减1)。
  2. 使用int时,很容易执行简单的数学运算,但在客户端和服务器之间来回发送时很难在int和bytes之间进行转换。
  3. 我找到了一个可以从int转换为字节的方法。我找到了一些关于使用Bytebuffer转换为int的信息,但我不确定它是否正确。有没有更简单的方法来处理在数据报中发送int的过程?在字节和整数之间来回转换似乎是一项非常大的工作。

3 个答案:

答案 0 :(得分:1)

任何这些行动都没什么难的。 DataInputStreamDataOutputStream负责stream->int->stream次转化,ByteArrayInputStreamByteArrayOutputStream负责stream->byte[]->stream次转化。

答案 1 :(得分:0)

有两种选择:

  • 上面提到的bytebuffer
  • 通过bitshift进行转换:

    //int to byte[]
    int val = someval;
    byte[] bytes = new byte[4];
    
    for(int i = 0 ; i < 4 ; i++)
        bytes[i] = (byte) (val >>> (i * 8));
    
    //byte[] to int
    int val = 0;
    byte[] bytes = input();
    
    for(int i = 0 ; i < 4 ; i++)
        val |= ((int)(bytes[i])) << i * 8;
    

答案 2 :(得分:0)

如果要定义自己的数据报格式,则很容易确定内容的第n个4字节表示整数。

然后,您可以使用一些简单的转换函数从int转到byte[],反之亦然。

实现这两种方法的小类应该:

public static byte[] toByteArray(int value) {
    byte[] b = new byte[4];

    // MSB to LSB
    b[0] = (byte) (value >> 24);
    b[1] = (byte) (value >> 16);
    b[2] = (byte) (value >> 8);
    b[3] = (byte) (value);

    return b;
}

public static int fromByteArray(byte[] value) {
    int i = ((((int) value[0]) & 0xFF) << 24) |
            ((((int) value[1]) & 0xFF) << 16) |
            ((((int) value[2]) & 0xFF) << 8) |
            ((((int) value[3] & 0xFF)));
    return i;
}