我有一个长度为18的字节数组,结构如下:
unsigned int a;
unsigned int b;
unsigned short c;
unsigned long d;
我知道我在Java中没有使用unsigned *数据类型。在搜索表单web之后,我发现我应该使用更大的数据类型来存储值。例如,我应该使用int来存储一个无符号的短变量。
我有两个问题。第一个是如何解析字节数组以获取数组中的值到我正在使用的变量。第二个是如何处理unsigned long变量?我知道可能BigInteger
可以帮助我,但我不知道如何解决这个问题。
答案 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
可能是你唯一的(实用的)方式。