这些是 Java 长整数还是 BigInteger 格式数字?IP2Location csv 数据库

Are these Java long integer or BigInteger format numbers? IP2Location csv database

提问人:Mick 提问时间:6/30/2023 最后编辑:Mick 更新时间:7/1/2023 访问量:83

问:

我从未在我的 Java 代码中使用过长整数或 BigInteger 格式的数字,并且 IP2Location 数据库的这一方面似乎没有记录。我需要知道它是什么,这样我就可以编写一些简单的代码来比较大于或等于的数字。以下是文件中的几行数据...

"281470698522624","281470698524671","CN","China","Guangdong","Guangzhou"
"281470698524672","281470698528767","JP","Japan","Tokyo","Tokyo"

编辑:每行开头的两个数字表示位于该行最后 4 个条目标识的城市中的 IP 地址范围。我按照已知算法将我的 IP 地址转换为十进制表示法,然后按顺序搜索文件,直到找到大于或等于我的 IP 的第二个数字。然后我有了位置数据:) QED型

希望你能帮上忙,米克:)

Java BigInteger IP2Location

评论

1赞 user16320675 6/30/2023
long仅限于 -9223372036854775808 到 9223372036854775807 之间的数字,包括 - - 2^2147483647(不包括)到 +2^2147483647(不包括) -- 发布的数字完全在范围内BigIntegerlong
0赞 aled 6/30/2023
你说的是什么算法?这是理解这个问题所必需的。
0赞 President James K. Polk 6/30/2023
它们只是整数,简单明了。你是在问它们是否适合 java 吗?long

答:

-1赞 WJS 6/30/2023 #1

你问:

这些是 Java 长整数还是 BigInteger 格式数字?

它们是价值观。long

在 Java 中,您可以通过使用设置和查看每个 的 和 。您可以使用 SIZE 查看它们的宽度。minmaxMIN_VALUEMAX_VALUEByte, Short, Integer, Long, Float, and Double

例子:

System.out.println(Long.MAX_VALUE);
System.out.println(Long.SIZE);

指纹

9223372036854775807
64

查看 DoubleFloat 以获取更多常量,例如 MIN_EXPONENT 和 PRECISION。

有关超出这些类型的要求,请查看 BigIntegerBigDecimal

此外,如果要查找最大位数,请在 (类似于 ) 中执行以下操作:longint, short, or byte

double digitsInLong = (Long.SIZE*Math.log(2))/Math.log(10);
System.out.println(digitsInLong);

指纹

19.265919722494793

这表示可以有 between 和 digits。所有多头都可以有数字,但有些多头会溢出正数的位大小限制。1920192063

-1赞 Reilas 6/30/2023 #2

可以使用 Long#parseLong 方法将 String 值转换为基元数据类型。

String[] a = { "281470698522624","281470698524671","CN","China","Guangdong","Guangzhou" };
String[] b = { "281470698524672","281470698528767","JP","Japan","Tokyo","Tokyo" };
long a0 = Long.parseLong(a[0]);
long a1 = Long.parseLong(a[1]);
long b0 = Long.parseLong(b[0]);
long b1 = Long.parseLong(b[1]);
System.out.println("a0 = " + a0);
System.out.println("a1 = " + a1);
System.out.println("b0 = " + b0);
System.out.println("b1 = " + b1);

输出

a0 = 281470698522624
a1 = 281470698524671
b0 = 281470698524672
b1 = 281470698528767

如果要使用 BigInteger 类,只需提供 String 值作为构造函数方法的参数即可。

BigInteger a0 = new BigInteger(a[0]);
BigInteger a1 = new BigInteger(a[1]);
BigInteger b0 = new BigInteger(b[0]);
BigInteger b1 = new BigInteger(b[1]);
1赞 rzwitserloot 6/30/2023 #3

它记录在案

ip_from INT(10)  / Decimal(39,0)    First IP address in netblock.
ip_to   INT(10)  / Decimal(39,0)    Last IP address in netblock.

假设您的样本包含 10 位以上的数字,那么您就拥有 DB4 的 IPv6 版本。在您的问题中提及这将是一件好事。这些数字可以变得非常大 - 大于可以支持的程度(可以达到 ,也就是 ,远远小于 39 个 9,这是这些数字理论上可以达到的程度。longLong.MAX_VALUE2^63-1

你可以用 或 2 个长项来表示它们(IPv6 地址的长度为 128 位,长项为 64 位,所以 2 个长项可以做到这一点 - 鉴于这是基本的 IPv6 信息,我认为 IP2Location 没有提到这一点是有用或必要的。事实上,称其为“decimal(39,0)”是一种愚蠢的方式,将“IPv6地址表示为十进制表示的单个数字”。无论如何,它们表示 InetAddresses,因此您可能希望使用实际描述它是什么的类,即 InetAddressBigInteger

评论

0赞 Mick 7/1/2023
谢谢。我没有发现这一点,因为我没有走出免费的数据库部分:)
0赞 Mick 7/1/2023 #4

我找到了我需要的一切方法......

IPAddress Java library
https://seancfoley.github.io/IPAddress/

该库的经理已在有关此主题的几个线程中发布了此链接。