我遇到了一个问题,并试图在网上找到解决方案,但无法获得确切或类似的解决方案。我在套接字上获得数据包的问题(当然,将读取为byte[]),现在我想解析这个数据包。最初两个字节是整数(类型),接下来的两个字节又是整数(有效载荷长度),然后32字节的有效载荷数据和接下来的4个字节是CRC。这里的问题是我无法获得正确的方法来解析数据包,所以我获得了类型,有效负载长度。如果我知道将字节读取为正确格式的方法,我也可以读取有效负载数据。所以任何人都可以建议如何将byte[]读成正确的类型。提前谢谢。
有效载荷分组数据格式(部分)-
镜头类型
2B无符号短
2B无符号短
2B无符号短
2B无符号短
2B无符号短
4B带符号Long
4B带符号Long
4B带符号Long
4B带符号Long
发布于 2015-01-05 10:35:33
如果字节顺序是大端的,并且没有填充,那么可以使用DataInputStream
的原语读取方法:readShort()
表示类型;另一个readShort()
表示长度;readFully()
表示有效载荷;readInt()
表示CRC。
发布于 2015-01-05 11:52:06
您可以使用类似于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();
发布于 2015-01-05 10:02:05
您可以使用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
https://stackoverflow.com/questions/27776961
复制相似问题