【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