[英]Raw data parsing
我有一个长度为18的字节数组,具有以下结构:
unsigned int a;
unsigned int b;
unsigned short c;
unsigned long d;
我知道我在Java中没有unsigned *数据类型。 搜索表单Web后,我发现我应该使用更大的数据类型来存储值。 例如,我应该使用int存储一个无符号的short变量。
我有两个问题。 第一个是如何解析字节数组以将值从数组传递到我正在使用的变量。 第二个是如何处理无符号长变量? 我知道BigInteger
可能会帮助我,但我不确定如何解决。
至少有两种实用的方法可以对数据进行解码。 您可以像这样手动进行字节摆弄(假设为little-endian):
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
当然,处理它的方式是无限的。 这些只是示例。 从ByteArrayInputStream
初始化DataInputStream
可能是另一个示例。
至于处理unsigned long
,Java显然不能做到这一点,但是取决于您打算对它们执行哪种操作,您可能不必在意。 像AND,OR或一般的位移位之类的通用位摆弄,以及诸如加法和减法之类的简单算术,毕竟根本不关心符号性(尽管请检查>>
和>>>
之间的差异)。
如果您真的想执行一般的unsigned long
算术,那么BigInteger
实际上可能是您唯一的(实用)方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.