如何在Java中将byte[]转换为正BigInteger?

7
我正在与另一个使用C语言的团队合作。我们之间通信的协议会发送一个IP地址,以byte[]格式表示,并且还有两个"掩码"值,它们是byte[8]。我想将这个IP地址作为BigInteger来使用,以便可以进行比较,看看一个IP地址是否在另外两个IP地址之间。为了确保符号不会影响我的结果,我需要一种方法将IP从byte[](IPv4为4字节,IPv6为16字节)转换为BigInteger中的正值。请问是否有相关的参考资料或者建议如何实现?
3个回答

14

Java提供了一个BigInteger构造函数,它接受一个有符号整数和一个字节数组。因此,您可以这样做:

BigInteger ip = new BigInteger(1, ipBytes);

可以在此处查看文档: BigInteger(int, byte[])


只是想知道...当我们调用 toByteArray() 方法时,这个对象会返回什么?确切地说,构造函数中的 ipBytes 参数是什么? - Marcin Mierzejewski
1
BigInteger.toByteArray() 返回一个包括符号在内的字节数组,可以在 BigInteger(byte[]) 构造器中使用。http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigInteger.html#toByteArray() - Richard Campbell
也许这是另一个SO问题,但在这种情况下如何获取原始字节? - Marcin Mierzejewski
1
原始字节数组将按需要由BigInteger在构造过程中进行编辑-如此处所示,所有前导0都将被删除https://dev59.com/MW025IYBdhLWcg3wqXxo因此,除了在其他地方保存副本外,无法保证从BigInteger返回原始字节。 - Richard Campbell
这个注释可能会节省我很多调试时间。谢谢Richard! - Marcin Mierzejewski

12

只需使用接受字节数组和参数(表示正或负)的构造函数


哎呀!我怎么会错过那个?!?! - Deven Phillips

2

正如其他人指出的那样,BigInteger构造函数应该没问题。值得注意的一点是JVM是大端序,因此请确保传入的字节数组也是大端序的。如果你从套接字中获取字节,则不需要做任何事情,因为网络字节顺序也是大端序的,但如果你在x86硬件上运行并通过其他方式获取数据,则可能会有问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接