【问题标题】:How can I convert a byte[] to a POSITIVE BigInteger in Java?如何在 Java 中将 byte[] 转换为 POSITIVE BigInteger?
【发布时间】:2011-10-10 11:00:22
【问题描述】:

我正在与另一个使用 C 语言的团队合作。我们与之通信的协议发送一个字节 [] 格式的 IP 地址,以及 2 个字节 [8] 的“掩码”值。我想将 IP 地址用作 BigInteger,以便进行比较以查看 IP 地址是否介于其他 2 个 IP 地址之间。为了确保签名不会搞砸我,我需要一种方法将 IP 从字节 [](IPv4 的 4 字节或 IPv6 的 16 字节)转换为 BigInteger 中的正值。有人可以指点我参考或建议完成此操作的方法吗?

【问题讨论】:

    标签: java math binary


    【解决方案1】:

    Java 有一个 BigInteger 构造函数,它接受一个符号整数和一个字节数组。所以你可以这样做:

    BigInteger ip = new BigInteger(1, ipBytes);
    

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

    【讨论】:

    • 只是想知道......当我们调用 toByteArray() 时这个对象返回什么?正是构造函数中的 ipBytes 参数?
    • 没有。 BigInteger.toByteArray() 返回一个包含符号的字节数组,可以在 BigInteger(byte[]) 构造函数中使用。 docs.oracle.com/javase/1.5.0/docs/api/java/math/…
    • 我猜可能是另一个 SO 问题,但是在这种情况下如何获取原始字节有什么问题吗?
    • BigInteger 在构造中将根据需要编辑原始字节数组 - 如此处所示,所有前导 0 将被删除 stackoverflow.com/questions/5878603/… - 因此无法保证从原始字节返回一个 BigInteger,而不是在别处保存副本。
    • 这个评论可以节省我很多调试时间。谢谢理查德!
    【解决方案2】:

    只需使用constructor,它接受一个字节数组和一个参数来说明它是正数还是负数。

    【讨论】:

    • 嗯嗯!我怎么错过了?!?!
    【解决方案3】:

    正如其他人所说,BigInteger 构造函数应该没问题。值得注意的一件事是 JVM 是大端的,所以只要确保你传入的字节数组也是。如果您从套接字获取字节,则无需执行任何操作,因为网络字节顺序也是大端,但如果您在 x86 硬件之类的小端机器上运行并获取数据,则可能会出现问题其他方式。

    【讨论】:

      猜你喜欢
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 2016-09-03
      • 2023-04-07
      • 2013-07-23
      • 2011-01-12
      相关资源
      最近更新 更多