【Java】Network maskからPrefix lengthに変換する方法
ネットワークマスクの文字列からInt型のプレフィックスに変換する方法。
import java.net.InetAddress; import java.net.UnknownHostException; public class CodeSample { public static void main(String args[]){ try{ System.out.println("prefix length : " + networkMaskToPrefixLength("128.0.0.0")); System.out.println("prefix length : " + networkMaskToPrefixLength("255.128.0.0")); System.out.println("prefix length : " + networkMaskToPrefixLength("255.255.248.0")); System.out.println("prefix length : " + networkMaskToPrefixLength("255.255.255.224")); System.out.println("prefix length : " + networkMaskToPrefixLength("255.255.255.255")); } catch(UnknownHostException e){ e.printStackTrace(); } catch(IllegalArgumentException e){ e.printStackTrace(); } } public static int networkMaskToPrefixLength(String networkMask) throws UnknownHostException{ InetAddress inetAddr = InetAddress.getByName(networkMask); int intAddr = inetAddressToInt(inetAddr); return getPrefixLength(intAddr); } public static int getPrefixLength(int intAddr){ int prefixLength = Integer.bitCount(intAddr); // Bitが左詰めで1となっているかをチェックする // 1と1の間に0が含まれている場合、エラーとして扱う int baseMask = 0xFFFFFFFF; for(int i = 0; i < 32; i++){ if((intAddr & 0x00000001) == 1){ if((intAddr & baseMask) != baseMask){ throw new IllegalArgumentException(); } break; } intAddr = intAddr >> 1; baseMask = baseMask >> 1; } return prefixLength; } public static int inetAddressToInt(InetAddress inetAddr){ byte[] addr = inetAddr.getAddress(); return ((addr[0] & 0xFF) << 24) | ((addr[1] & 0xFF) << 16) | ((addr[2] & 0xFF) << 8) | (addr[3] & 0xFF); } }
出力結果
prefix length : 1 prefix length : 9 prefix length : 21 prefix length : 27 prefix length : 32