【问题标题】:Byte Operations and Datagrams in JavaJava中的字节操作和数据报
【发布时间】:2023-03-17 10:31:01
【问题描述】:

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

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

【问题讨论】:

  • 我认为您在将信息作为字节数组发送方面没有太多选择。你还能怎么寄呢?

标签: java int byte datagram


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    有两种选择:

    • 上面提到的字节缓冲区
    • 通过位移转换:

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

    【讨论】:

      【解决方案3】:

      如果您要定义自己的数据报格式,则很容易确定第 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-29
        • 1970-01-01
        • 2016-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多