2

ここで私がやりたいことは次のとおりですが、2 つの問題があります。 () 呼び出し - コンパイラは putShort() を認識しないと文句を言います。

// Method to create a packet header for sending a packet. The placement of the two numbers is
//  done according to little-endian encoding.
private byte[] createPacketHeader(EPacketType packetType, int fourBits,
                                  int totalMessageLength, int segmentSize) {

    return ByteBuffer.allocate(CPacketHeaderSize).order(ByteOrder.LITTLE_ENDIAN).
            put((byte) ((byte) (packetType.getValue() << 4) | (byte) fourBits)).
            putInt(totalMessageLength).  // Bottom 3 bytes of total length (+ 1 byte discarded)
            position(-1).  // Reposition to discard last byte from above call !!DOESN'T WORK!!
            putShort((short) segmentSize).  // Segment length
            put(_connectIdUtf8).  // Connection ID in UTF-8, should be <= 10 bytes
            array();  // This assumes zero initialization so final bytes are zero
}

だからここに私が現在やっていることがあります。それは機能しますが、私が望んでいたことと比べると、かなり洗練されていないようです。

    ByteBuffer byteBuffer =
                     ByteBuffer.allocate(CPacketHeaderSize).order(ByteOrder.LITTLE_ENDIAN);

    byteBuffer.put((byte) ((byte) (packetType.getValue() << 4) | (byte) fourBits)).
            putInt(totalMessageLength).  // Bottom 3 bytes of total length (+ 1 byte discarded)
            position(byteBuffer.position() -1);  // Discard last byte from above call

    byteBuffer.putShort((short) segmentSize).  // Segment length
            put(_connectIdUtf8);  // Connection ID in UTF-8, should be <= 10 bytes

    return byteBuffer.array();  // This assumes zero initialization so final bytes are zero

最初の試みに近いものに戻す方法について何か提案はありますか?

編集:答えてくれてありがとう、それらはすべて役に立ちました。誰かが興味を持っているなら、これが私がやったことです:

// Method to create a packet header for sending a packet. The placement of the two numbers is
//  done according to little-endian encoding.
private byte[] createPacketHeader(EPacketType packetType, int fourBits,
                                  int totalMessageLength, int segmentSize) {

    return ByteBuffer.allocate(CPacketHeaderSize).order(ByteOrder.LITTLE_ENDIAN).
            put((byte) ((byte) (packetType.getValue() << 4) | (byte) fourBits)).
            put(intToThreeBytes(totalMessageLength)).  // Bottom 3 bytes of total length
            putShort((short) segmentSize).  // Segment length
            put(_connectIdUtf8).  // Connection ID in UTF-8, should be <= 10 bytes
            array();  // This assumes zero initialization so final bytes are zero
}


// Method to convert an int into a three-byte byte array, using little-endian encoding
private byte[] intToThreeBytes(int aNumber) {
    byte[] byteArray = new byte[3];
    for (int i = 0; i < 3; i++)
        byteArray[i] = (byte)(aNumber >> i * 8);
    return byteArray;
}
4

3 に答える 3

1

position メソッドは ByteBuffer で定義されていません。しかし、そのスーパークラスの Buffer. したがって、position メソッドを呼び出した後、putShort メソッドを呼び出す前に、明示的に ByteBuffer に型キャストする必要があります。以下のようにコードを変更します。

return ((ByteBuffer)(ByteBuffer.allocate(CPacketHeaderSize).order(ByteOrder.LITTLE_ENDIAN).
        put((byte) ((byte) (packetType.getValue() << 4) | (byte) fourBits)).
        putInt(totalMessageLength).  // Bottom 3 bytes of total length (+ 1 byte discarded)
        position(-1))).  // Reposition to discard last byte from above call !!DOESN'T WORK!!
        putShort((short) segmentSize).  // Segment length
        put(_connectIdUtf8).  // Connection ID in UTF-8, should be <= 10 bytes
        array();
于 2013-08-02T13:19:27.123 に答える