Parse a DatagramPacket after converting it to a byte array in Java

前端 未结 4 1203
日久生厌
日久生厌 2021-02-04 20:42

I am trying to parse a DatagramPacket that I will receive at a socket. I know the format of the packet I will receive, which is a DHCPREQUEST packet, but I don\'t think that rea

相关标签:
4条回答
  • 2021-02-04 21:22

    What you do is write yourself some helper methods to extract 2 byte, 4 byte, etc values from the packet, reading the bytes and assembling them into Java short, int or whatever values.

    For example

        public short getShort(byte[] buffer, int offset) {
            return (short) ((buffer[offset] << 8) | buffer[offset + 1]);
        }
    

    Then you use these helper methods as often as you need to. (If you want to be fancy, you could have the methods update an attribute that holds the current position, so that you don't have to pass an offset argument.)


    Alternatively, if you were not worried by the overheads, you could wrap the byte array in ByteArrayInputStream and a DataInputStream, and use the latter's API to read bytes, shorts, ints, and so on. IIRC, DataInputStream assumes that numbers are represented in the stream in "network byte order" ... which is almost certainly what the DHCP spec mandates.

    0 讨论(0)
  • 2021-02-04 21:25

    The cleanest way to do something like this is probably to use the utility method Arrays.copyOfRange.

    0 讨论(0)
  • 2021-02-04 21:39

    I'm a bit late to this, but there's a ByteBuffer class:

    ByteBuffer b = ByteBuffer.wrap(request.getData());
    
    byte opcode = b.get();
    byte hwtype = b.get();
    byte hw_addr_len = b.get();
    byte hops = b.get();
    int xid = b.getInt();
    short seconds = b.getShort();
    

    Or, if you only need a single field:

    ByteBuffer b = ByteBuffer.wrap(request.getData());
    int xid = b.getInt(4);
    
    0 讨论(0)
  • 2021-02-04 21:46

    Wrap the byte array in a ByteArrayOutputStream; wrap a DataInputStream around that; then use the methods of DataInputStream.

    0 讨论(0)
提交回复
热议问题