我有一项任务。从InputStream我应该收到多部分消息。前四个字节是消息长度,其他字节是消息体。同时可以收到很多消息。例如: 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);
}
但它没有用,我没有更多的想法。请帮帮我
答案 0 :(得分:1)
您最初提供的代码似乎不太可能编译(可能这是您遇到的问题,但您没有真正指定)?
要修复它,我必须通过将getLength()
的结果转换为short
来byteArrayToInt
返回short
。或者您可以返回int
。我删除了对ByteUtils
的静态引用,因为我将所有方法都放在一个类中。
我还在调用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
语句)
对于较大的值(超过16位),您的byteArrayToInt
方法似乎无法正常工作。 this question的答案中有一些示例实现(包括一些单行)。