晴雪的镰刀

生而灾星,请务必坚强

导航

统计

【很简洁】两行代码判断IP地址归属地是洲内还是洲外

支持多种语言
原理:根据IPv4地址首位判断是否属于亚太地区(APNIC)管辖
说明:仅限估计,有些情况下不是特别准确,建议用于服务器防火墙过滤等场合
Java(第一种):
String ip="114.5.1.4";

static final String N=new java.math.BigInteger("1ljkvi5u19606s37nxu2ao4bjh5ld594gocu1j05ftpgykadq8",36).toString(2);
boolean inAsia=N.charAt(Integer.parseInt(ip.substring(0,ip.indexOf("."))))=='1';//true

Java(第二种):

复制代码
//According to https://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.xhtml
static long[] co=new long[]{0x402200100930403cl,0x523ffffl,0x400024010110b00l,0x30303fl<<8};
public static boolean inAsia(String ip){
    int c=Integer.parseInt(ip.substring(0,ip.indexOf(".")));
    return (co[c>>6]&(1l<<63-(63&c)))!=0;
}
public void demo(){
    while(true)System.out.println(inAsia(new java.util.Scanner(System.in).nextLine())?"在亚太":"在洲外");
}
复制代码

C/C++:

long long co[4]={0x402200100930403cll,0x523ffffll,0x400024010110b00ll,0x30303fll<<8};
char inAsia(const char* x){
    for(int c=*x^'0',i=0;x[++i]^'.';c=(c<<3)+(c<<1)+(x[i]^'0'));
    return 1&(co[c>>6]>>63-(63&c));
}
int main(){
    for(char q[16];scanf("%s",q),1;puts({"在洲外","在亚太"}[inAsia(q)]));
}

其中的大位数(256bit)实际为十六进制的:

402200100930403c000000000523ffff0400024010110b000030303f00000000

(完)

posted on   Sherilyn  阅读(424)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示