1

私には仕事があります。InputStream から、マルチパート メッセージを受け取る必要があります。最初の 4 バイトがメッセージ長で、残りのバイトがメッセージ本体です。同時に多くのメッセージを受信できます。例: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16

がある

1,2,3,4 - length(in this case 4), 3,4,5,6 - body
7,8,9,10 - length (6), 11,12,13,14,15,16 - body

等々

この方法で計算する長さ:

public static int byteArrayToInt(byte[] paRawBytes, int piOffset, boolean pbBigEndian) {

    int iRetVal = -1;

    if(paRawBytes.length < piOffset + 4)
        return iRetVal;

    int iLowest;
    int iLow;
    int iMid;
    int iHigh;

    if(pbBigEndian)
    {
        iLowest = paRawBytes[piOffset + 3];
        iLow    = paRawBytes[piOffset + 2];
        iMid    = paRawBytes[piOffset + 1];
        iHigh   = paRawBytes[piOffset];
    }
    else
    {
        iLowest = paRawBytes[piOffset];
        iLow    = paRawBytes[piOffset + 1];
        iMid    = paRawBytes[piOffset + 2];
        iHigh   = paRawBytes[piOffset + 3];
    }

    // Merge four bytes to form a 32-bit int value.
    iRetVal = (iHigh << 24) | (iMid << 16) | (iLow << 8) | (0xFF & iLowest);

    return iRetVal;
}

もっと:

private static void getEventsList(byte[] bytesFromInputStream) {


    int start = 4;

    int end = getLength(bytesFromInputStream) + 4;

    byte[] tmp;

    tmp = Arrays.copyOfRange(bytesFromInputStream, start, end);


    eventsArrayList.add(tmp);

    if (bytesFromInputStream.length > end) {

        byte[] newArray = Arrays.copyOfRange(bytesFromInputStream, end, bytesFromInputStream.length);


        getEventsList(newArray);
    }


}

private static short getLength(byte[] bytes) {
    return ByteUtils.byteArrayToInt(Arrays.copyOfRange(bytes, 0, 4), 0, true);
}

しかし、それは機能しておらず、私にはそれ以上の考えがありません。お願い助けて

4

1 に答える 1

1

あなたが最初に提供したコードは完全にコンパイルされていないようです (おそらくそれがあなたが抱えていた問題でしたが、実際には指定していませんでした)?

これを修正するには、 toの結果をキャストしてgetLength()a を返さなければなりませんでした。または、代わりにa を返すこともできます。すべてのメソッドを 1 つのクラスにまとめたため、静的参照を削除しました。shortbyteArrayToIntshortintByteUtils

また、メソッド シグネチャが一致するように、0への呼び出しに オフセットを追加しました。byteArrayToInt

その後、少なくともいくつかの単純なケースでは、コードが機能しているようです。

byte[] message = new byte[]{0,0,0,1, 1, 0,0,0,2, 2,3};
getEventsList(message);

生成:

Got a message of length: 1
Content 1
Got a message of length: 2
Content 2
Content 3

println(一部発言も追加)

あなたのbyteArrayToInt方法は、大きな値 (16 ビット以上) では正しく機能しないようです。この質問への回答には、いくつかの実装例 (ワンライナーを含む) があります。

于 2012-10-22T21:03:31.660 に答える