From dec3c75f319cc75428c9c618834ab7f4ed7af9aa Mon Sep 17 00:00:00 2001 From: jptx1234 Date: Thu, 6 May 2021 22:57:09 +0800 Subject: [PATCH] =?UTF-8?q?MaskBit=E5=A2=9E=E5=8A=A0=E6=8E=A9=E7=A0=81?= =?UTF-8?q?=E5=8F=8D=E5=90=91=E8=BD=AC=E6=8D=A2=E7=9A=84=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8CIpv4Util=E7=9A=84getMaskBitByMask=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E4=BB=8EMaskBit=E8=8E=B7=E5=8F=96=EF=BC=8C=E6=8F=90=E5=8D=87?= =?UTF-8?q?=E9=80=9F=E5=BA=A6=EF=BC=8CIpv4Util=E5=A2=9E=E5=8A=A0=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E6=8E=A9=E7=A0=81=E5=92=8C=E6=8E=A9=E7=A0=81=E4=BD=8D?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E5=90=88=E6=B3=95=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/net/Ipv4Util.java | 51 ++++++++++++------- .../main/java/cn/hutool/core/net/MaskBit.java | 21 ++++++-- .../java/cn/hutool/core/net/Ipv4UtilTest.java | 33 ++++++++++++ 3 files changed, 83 insertions(+), 22 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java b/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java index 56121c8e8..2ae114f4e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java @@ -194,28 +194,18 @@ public class Ipv4Util { /** * 根据子网掩码转换为掩码位 * - * @param mask 掩码,例如xxx.xxx.xxx.xxx - * @return 掩码位,例如32 + * @param mask 掩码的点分十进制表示,例如 255.255.255.0 + * + * @return 掩码位,例如 24 + * + * @throws IllegalArgumentException 子网掩码非法 */ public static int getMaskBitByMask(String mask) { - StringBuffer sbf; - String str; - int inetmask = 0; - int count; - for (String part : StrUtil.split(mask, CharUtil.DOT)) { - sbf = toBin(Integer.parseInt(part)); - str = sbf.reverse().toString(); - count = 0; - for (int i = 0; i < str.length(); i++) { - i = str.indexOf('1', i); - if (i == -1) { - break; - } - count++; - } - inetmask += count; + Integer maskBit = MaskBit.getMaskBit(mask); + if (maskBit == null) { + throw new IllegalArgumentException("Invalid netmask " + mask); } - return inetmask; + return maskBit; } /** @@ -288,6 +278,29 @@ public class Ipv4Util { return count; } + /** + * 判断掩码是否合法 + * + * @param mask 掩码的点分十进制表示,例如 255.255.255.0 + * + * @return true:掩码合法;false:掩码不合法 + */ + public static boolean isMaskValid(String mask) { + return MaskBit.getMaskBit(mask) != null; + } + + /** + * 判断掩码位是否合法 + * + * @param maskBit 掩码位,例如 24 + * + * @return true:掩码位合法;false:掩码位不合法 + */ + public static boolean isMaskBitValid(int maskBit) { + return MaskBit.get(maskBit) != null; + } + + //-------------------------------------------------------------------------------- Private method start /** diff --git a/hutool-core/src/main/java/cn/hutool/core/net/MaskBit.java b/hutool-core/src/main/java/cn/hutool/core/net/MaskBit.java index 8705d5c26..3077ada2f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/MaskBit.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/MaskBit.java @@ -1,7 +1,7 @@ package cn.hutool.core.net; +import cn.hutool.core.map.BiMap; import java.util.HashMap; -import java.util.Map; /** * 掩码位和掩码之间的Map对应 @@ -11,9 +11,12 @@ import java.util.Map; */ public class MaskBit { - private static final Map MASK_BIT_MAP; + /** + * 掩码位与掩码的点分十进制的双向对应关系 + */ + private static final BiMap MASK_BIT_MAP; static { - MASK_BIT_MAP = new HashMap<>(32); + MASK_BIT_MAP = new BiMap<>(new HashMap<>(32)); MASK_BIT_MAP.put(1, "128.0.0.0"); MASK_BIT_MAP.put(2, "192.0.0.0"); MASK_BIT_MAP.put(3, "224.0.0.0"); @@ -57,4 +60,16 @@ public class MaskBit { public static String get(int maskBit) { return MASK_BIT_MAP.get(maskBit); } + + /** + * 根据掩码获取掩码位 + * + * @param mask 掩码的点分十进制表示,如 255.255.255.0 + * + * @return 掩码位,如 24;如果掩码不合法,则返回null + */ + public static Integer getMaskBit(String mask) { + return MASK_BIT_MAP.getKey(mask); + } + } diff --git a/hutool-core/src/test/java/cn/hutool/core/net/Ipv4UtilTest.java b/hutool-core/src/test/java/cn/hutool/core/net/Ipv4UtilTest.java index cd901bc3c..5a472963c 100644 --- a/hutool-core/src/test/java/cn/hutool/core/net/Ipv4UtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/net/Ipv4UtilTest.java @@ -5,6 +5,7 @@ import org.junit.Assert; import org.junit.Test; import java.util.List; +import org.junit.function.ThrowingRunnable; public class Ipv4UtilTest { @@ -14,6 +15,12 @@ public class Ipv4UtilTest { Assert.assertEquals(24, maskBitByMask); } + @Test + public void getMaskBitByIllegalMaskTest() { + ThrowingRunnable getMaskBitByMaskRunnable = () -> Ipv4Util.getMaskBitByMask("255.255.0.255"); + Assert.assertThrows("非法掩码测试", IllegalArgumentException.class, getMaskBitByMaskRunnable); + } + @Test public void getMaskByMaskBitTest(){ final String mask = Ipv4Util.getMaskByMaskBit(24); @@ -42,4 +49,30 @@ public class Ipv4UtilTest { final List list = Ipv4Util.list("192.168.100.2", maskBit, false); Assert.assertEquals(254, list.size()); } + + @Test + public void isMaskValidTest() { + boolean maskValid = Ipv4Util.isMaskValid("255.255.255.0"); + Assert.assertTrue("掩码合法检验", maskValid); + } + + @Test + public void isMaskInvalidTest() { + Assert.assertFalse("掩码非法检验 - 255.255.0.255", Ipv4Util.isMaskValid("255.255.0.255")); + Assert.assertFalse("掩码非法检验 - null值", Ipv4Util.isMaskValid(null)); + Assert.assertFalse("掩码非法检验 - 空字符串", Ipv4Util.isMaskValid("")); + Assert.assertFalse("掩码非法检验 - 空白字符串", Ipv4Util.isMaskValid(" ")); + } + + @Test + public void isMaskBitValidTest() { + boolean maskBitValid = Ipv4Util.isMaskBitValid(32); + Assert.assertTrue("掩码位合法检验", maskBitValid); + } + + @Test + public void isMaskBitInvalidTest() { + boolean maskBitValid = Ipv4Util.isMaskBitValid(33); + Assert.assertFalse("掩码位非法检验", maskBitValid); + } }