我遇到了问题,并试图在网上找到解决方案,但无法获得完全或类似的解决方案。 我在套接字上得到数据包的问题(当然,将被读作byte []),现在我想解析这个数据包。初始的两个字节是整数(类型),接下来的两个字节再次是整数(有效载荷长度),然后32字节和下一个4字节的有效载荷数据是CRC。 这里的问题是我无法获得正确的方法来解析数据包,因此我得到了类型,有效负载长度。如果我知道将字节读入正确格式的方法,我也可以读取有效载荷数据。所以任何人都可以建议如何将byte []读入正确的类型。提前谢谢。
有效载荷的分组数据格式(部分) -
Len Type
2B Unsigned Short
2B无符号短语
2B无符号短语
2B无符号短语
2B无符号短语
4B签名长
4B签名长
4B签名长
4B签名长
答案 0 :(得分:1)
如果字节顺序是big-endian且没有填充,则可以使用DataInputStream
的原始读取方法:readShort()
作为类型;另一个readShort()
的长度;有效载荷readFully()
;和readInt()
用于CRC。
答案 1 :(得分:1)
您可以使用类似于DataInputStream的ByteBuffer
。它还允许指定字节顺序:
// if you do not use NIO to read from socket, wrap a byte array:
ByteBuffer bb = ByteBuffer.wrap(bytes);
bb.order(ByteOrder.BIG_ENDIAN);
short short1 = bb.getShort();
short short2 = bb.getShort();
long long1 = bb.getLong();
答案 2 :(得分:0)
您可以使用DataInputStream
。但是,在使用它时,应仔细检查每个方法。在Java中,整数是4个字节,短路是2.所以当你说读取2个字节作为整数时,方法将是readShort()
,那么你可以将它转换为整数。
byte [] buffer = new byte[1024];
// populate your buffer
// you could also remove ByteArrayInputStream with the actual input stream.
DataInputStream in = new DataInputStream(new ByteArrayInputStream(buffer));
int theInteger = (int)in.readShort(); // reads 2 bytes from the stream and
// converts them to an integer