Java中的字节操作和数据报

Java中的字节操作和数据报,java,int,byte,datagram,Java,Int,Byte,Datagram,我正在尝试编写一个握手类型的消息,如下所示,其中C=客户机S=服务器: 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数据

我正在尝试编写一个握手类型的消息,如下所示,其中C=客户机S=服务器:

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位的,我更喜欢使用这种数据类型,但我似乎遇到了两个问题之一:

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

    有两种选择:

    • 上面提到的是bytebuffer
    • 通过位移位转换:

      //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;
      
      //int到字节[]
      int val=someval;
      字节[]字节=新字节[4];
      对于(int i=0;i<4;i++)
      字节[i]=(字节)(val>>>(i*8));
      //字节[]到int
      int-val=0;
      字节[]字节=输入();
      对于(int i=0;i<4;i++)
      
      val |=((int)(bytes[i])这些操作都不难
      DataInputStream
      DataOutputStream
      处理
      stream->int->stream
      转换,以及
      ByteArrayInputStream
      ByteArrayOutputStream
      处理
      流-/code>转换。如果您正在定义自己的数据报格式,很容易确定第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;
      }
      
      公共静态字节[]toByteArray(int值){
      字节[]b=新字节[4];
      //MSB到LSB
      b[0]=(字节)(值>>24);
      b[1]=(字节)(值>>16);
      b[2]=(字节)(值>>8);
      b[3]=(字节)(值);
      返回b;
      }
      来自ByteArray的公共静态int(字节[]值){
      
      int i=(((int)value[0])&0xFF)关于以字节数组的形式发送信息,我认为您没有太多选择。您还可以如何发送它?