繁体   English   中英

Java中的字节操作和数据报

[英]Byte Operations and Datagrams in Java

我正在尝试编写一个握手类型的消息,如下所示,其中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之间进行转换。

我找到了一个可以从int转换为字节的方法。 我找到了一些关于使用Bytebuffer转换为int的信息,但我不确定它是否正确。 有没有更简单的方法来处理在数据报中发送int的过程? 在字节和整数之间来回转换似乎是一项非常大的工作。

任何这些操作都没什么难的。 DataInputStreamDataOutputStream负责stream->int->stream转换, ByteArrayInputStreamByteArrayOutputStream负责stream->byte[]->stream转换。

有两种选择:

  • 上面提到的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; 

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

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

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

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM