代码之家  ›  专栏  ›  技术社区  ›  Trevor

在Java中查找2字节的值

  •  3
  • Trevor  · 技术社区  · 16 年前

    我试图在一个UDP包中找到前2个字节的值,该值对应于剩余有效负载的长度。什么是最好的方法来找到这个值在Java中,因为我知道前2个字节?会 java.nio.ByteBuffer 有什么用吗?

    谢谢

    4 回复  |  直到 16 年前
        1
  •  5
  •   Jack    16 年前

    我通常用这样的东西:

    static public int buildShort(byte high, byte low)
    {
      return ((0xFF & (int) high) * 256) + ((0xFF & (int) low));
    }
    

    然后你把你的前两个字节 DatagramPacket :

    int length = buildShort(packet.getData()[0], packet.getData()[1]);
    

    注意我用长度作为 int 因为也 short 数据类型(如每个人)在Java中签名,因此需要更大的空间。

        2
  •  3
  •   erickson    16 年前

    使用A ByteBuffer 很方便,不要被Java签名的16位值绊倒:

    byte[] data = new byte[MAX_LEN];
    ByteBuffer buf = ByteBuffer.wrap(data);
    DatagramPacket pkt = new DatagramPacket(data, data.length);
    ⋮    
    while (connected) {
      socket.receive(pkt);
      int len = buf.getShort() & 0xFFFF;
      ⋮
    }
    

    如果你不想使用 字节缓冲区 转换仍然相当容易。可以使用等价的乘法和加法,但我看到位运算符使用得更频繁:

    int len = (data[0] & 0xFF) << 8 | data[1] & 0xFF;
    
        3
  •  2
  •   BalusC    16 年前

    你真的可以利用 java.nio.ByteBuffer . 下面是一个启动示例:

    ByteBuffer buffer = ByteBuffer.allocate(2);
    buffer.order(ByteOrder.LITTLE_ENDIAN);
    buffer.put(byte1);
    buffer.put(byte2);
    int length = buffer.getShort(0) & 0xFFFF; // Get rid of sign.
    
        4
  •  1
  •   Justin    16 年前

    只有在读取UDP数据包(使用NIO)时,使用ByteBuffer才有价值。可以创建实用方法:

    static final int getLength(DatagramPacket packet) {
     byte data[] = DatagramPacket.getData();
     return (int)((0xFF & (int)data[0]) << 8) | (0xFF & (int)data[1]));
    }