数据包解析java中的字节

时间:2015-01-05 09:51:07

标签: java sockets parsing

我遇到了问题,并试图在网上找到解决方案,但无法获得完全或类似的解决方案。 我在套接字上得到数据包的问题(当然,将被读作byte []),现在我想解析这个数据包。初始的两个字节是整数(类型),接下来的两个字节再次是整数(有效载荷长度),然后32字节和下一个4字节的有效载荷数据是CRC。 这里的问题是我无法获得正确的方法来解析数据包,因此我得到了类型,有效负载长度。如果我知道将字节读入正确格式的方法,我也可以读取有效载荷数据。所以任何人都可以建议如何将byte []读入正确的类型。提前谢谢。

有效载荷的分组数据格式(部分) -

Len Type

2B Unsigned Short
2B无符号短语
2B无符号短语
2B无符号短语
2B无符号短语
4B签名长
4B签名长
4B签名长
4B签名长

3 个答案:

答案 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