原始数据解析

时间:2015-03-17 02:04:07

标签: java

我有一个长度为18的字节数组,结构如下:

unsigned int a;
unsigned int b;
unsigned short c;
unsigned long d;

我知道我在Java中没有使用unsigned *数据类型。在搜索表单web之后,我发现我应该使用更大的数据类型来存储值。例如,我应该使用int来存储一个无符号的短变量。

我有两个问题。第一个是如何解析字节数组以获取数组中的值到我正在使用的变量。第二个是如何处理unsigned long变量?我知道可能BigInteger可以帮助我,但我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:4)

至少有两种解码数据的实用方法。您可以像这样手动进行字节拼接(假设是小端):

a = (array[0] & 0xff) | ((array[1] & 0xff) << 8) | ((array[2] & 0xff) << 16) | ((array[3] & 0xff) << 24);
// Analogously for the others
// The "& 0xff"s are for stripping sign-extended bits.

或者,您可以使用java.nio.ByteBuffer

ByteBuffer buf = ByteBuffer.wrap(array);
buf.order(ByteOrder.LITTLE_ENDIAN);
a = buf.getInt();
// Analogously for the others

当然,有很多方法可以解决这个问题;这些只是一些例子。从DataInputStream初始化ByteArrayInputStream可能是另一个例子。

至于处理unsigned long,Java显然不能做到这一点,但根据你打算对它们进行什么样的操作,你可能不必关心。毕竟像AND,OR和位移这样的通用比特,以及像加法和减法这样的简单算术,毕竟不关心有效性(尽管检查>>和{{1}之间的差异})。

如果你真的想做一般的>>>算术,那么确实unsigned long可能是你唯一的(实用的)方式。