将十进制转换为二进制,任何基数

时间:2014-07-12 16:11:28

标签: java

长期的程序员,业余爱好者。

我们有一个80位帧(80 1' s / 0-s)来编码/解码铱/网络通信。要将所有参数转换为80位(纬度,经度,磁通等),位的对齐不是2,8,16等。它们对齐为3位,1,7,8等。 C中熟练的bit-twiddler知道屏蔽/移位操作,我不知道。经过几天的谷歌搜索,我得到了一个简单的例子(BigInteger?String oddString = Integer.toString(number,odd_radix)?char [] Buf?)。是否有直接的方式来做这个或者是一个很好的链接让我使用例子?

1 个答案:

答案 0 :(得分:1)

这实际上非常直截了当。主要问题是你有80位,而且没有一种“自然”的方式来表示它是Java中的整体块。

有BitSet类,但它并没有真正提供你想要的东西(即“我希望将3位7,8和9的值作为整数”或相反“设置从位开始的3位值7" )。

如果你的表现足够大,掩蔽和移动很简单。如果您的位数小于32,则简单int就足够大了。不幸的是,你的是80位,甚至很长(64位)都不够长。

然而,如果通过侥幸运气(没有经验的铱有效载荷,有效载荷在任何合理的边界上分解(即有一组场以32位屏障或64位屏障结束),那么你可以打破有效载荷以分离“块”,然后单独处理它们和位字段集,然后屏蔽和移位很容易。

另一个问题是Java没有unsigned数据类型,但如果您不需要尝试访问整个数据,则这不是问题。最后,有符号或无符号,32位是32位。

将字节转换为intslongs非常简单。你需要搜索它,但它很简单。

但是,假设您的有效负载可以大致分解为48位容器和32位容器。这意味着没有跨越48位标记的字段。这适用于8位标记的任何边界。

基本上你会将48位,6字节数组转换为long。

long l = convertFromBytes(sixByteArrayOfData);

然后移动和掩蔽很容易。您只需创建表示字段的常量(二进制),然后将它们转换为十六进制。

所以,说你想要第15,16,17,18位。

在二进制文件中,那是:

00000000 00000000 00000000 00000111 10000000 00000000

但那只是48位。所以,填写它

00000000 00000000 00000000 00000000 00000000 00000111 10000000 00000000

将其转换为十六进制:

00 00 00 00 00 07 80 00

使其成为单个十六进制常量:

long mask15to18 = 0x0000000000078000

现在你可以掩饰它:

int fieldValue = l & mask15to18;

然后你转移它。由于我们正在使用第15位,我们将其移位15次。

fieldValue = fieldValue >> 15;

你建立了一个面具和轮班的集合,以拉出你的领域。

要重新添加它们,只需再次移动蒙版,然后将其添加到最终值。

newValue = newValue + ((fieldValue << 15) & mask15to18)

您需要屏蔽以删除任何符号扩展名,因为您没有使用无符号值。

为每个字段执行此操作,直到您有一个解码和编码方法将有效负载从10字节数组转换为您通常可以使用的java对象。

它适用于int,byte,longs。只需要在有效负载中找到字段不跨越8位边界的点。这就是让它变得更容易的原因。