繁体   English   中英

原始数据解析

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM