package edu.sjtu.infosec.ismp.util; /** * ip地址格式化 * @author Wu Guojie * @date 2010-08-06 * @version 1.0 */ public class IpFormat { /** * ip地址格式化为16进制字符串 * @param ip 各部分需要用“.”分隔开,例如“192.168.1.1” * @return 16进制ip字符串(不被任何字符分割,例如“c0a80101”) * @throws Exception */ public static String stingToHex(String ip) throws Exception { if(ip == null){ throw new Exception("ip地址不能为null!"); }else if(ip.equals("")){ throw new Exception("ip地址不能为空字符串!"); }else{ String[] iPSubs = ip.split("\\."); if (iPSubs.length != 4) { throw new Exception("ip地址格式不对!"); }else{ if (!(iPSubs[0].matches("\\d{1,3}"))) { throw new Exception("ip地址第一段格式不对!"); } if (!(iPSubs[1].matches("\\d{1,3}"))) { throw new Exception("ip地址第二段格式不对!"); } if (!(iPSubs[2].matches("\\d{1,3}"))) { throw new Exception("ip地址第三段格式不对!"); } if (!(iPSubs[3].matches("\\d{1,3}"))) { throw new Exception("ip地址第四段格式不对!"); } } //IP的四段 int ipSub1 = Integer.parseInt(iPSubs[0]); int ipSub2 = Integer.parseInt(iPSubs[1]); int ipSub3 = Integer.parseInt(iPSubs[2]); int ipSub4 = Integer.parseInt(iPSubs[3]); //开始IP的四段十六进制 String ipSub1H = Integer.toHexString(ipSub1); if(ipSub1H.length()==1){ ipSub1H="0"+ipSub1H; } String ipSub2H = Integer.toHexString(ipSub2); if(ipSub2H.length()==1){ ipSub2H="0"+ipSub2H; } String ipSub3H = Integer.toHexString(ipSub3); if(ipSub3H.length()==1){ ipSub3H="0"+ipSub3H; } String ipSub4H = Integer.toHexString(ipSub4); if(ipSub4H.length()==1){ ipSub4H="0"+ipSub4H; } //十六进制IP String ipH = ipSub1H + ipSub2H + ipSub3H + ipSub4H; return ipH; } } /** * 10进制ip地址格式化为16进制字符串 * @param ip 例如“3232235777” * @return 16进制ip字符串(不被任何字符分割,例如“c0a80101”) * @throws Exception */ public static String decimalToHex(Long ipD) throws Exception { String ipH = Long.toHexString(ipD); return ipH; } /** * ip地址格式化为10进制long型数值 * @param ip 各部分需要用“.”分隔开,例如“192.168.1.1” * @return long型10进制ip数值(不被任何字符分割,例如“3232235777”) * @throws Exception */ public static long stingToDecimal(String ip) throws Exception { String ipH = stingToHex(ip); long ipD = Long.parseLong(ipH,16); return ipD; } /** * 16进制ip地址格式化为10进制long型数值 * @param ip 8位16进制数的ip,例如“c0a80101” * @return long型10进制ip数值(不被任何字符分割,例如“3232235777”) * @throws Exception */ public static long hexToDecimal(String ipH) throws Exception { long ipD = Long.parseLong(ipH,16); return ipD; } /** * 16进制ip地址格式化为用“.”分隔开字符串 * @param ip 8位16进制数的ip,例如“c0a80101” * @return 用“.”分隔开ip字符串(不被任何字符分割,例如“192.168.1.1”) * @throws Exception */ public static String hexToString(String ipH) throws Exception { if(ipH == null){ throw new Exception("16进制的ip地址格式不对,ip地址不能为null!"); }else if(ipH.equals("")){ throw new Exception("16进制的ip地址格式不对,ip地址不能为空字符串!"); }else if(ipH.length()!=8){ throw new Exception("16进制的ip地址格式不对,不是8位16进制数的ip!"); }else{ String ipSub1 = ipH.substring(0, 2); String ipSub2 = ipH.substring(2, 4); String ipSub3 = ipH.substring(4, 6); String ipSub4 = ipH.substring(6, 8); long ipSub1D = Long.parseLong(ipSub1,16); long ipSub2D = Long.parseLong(ipSub2,16); long ipSub3D = Long.parseLong(ipSub3,16); long ipSub4D = Long.parseLong(ipSub4,16); String ip = ipSub1D + "." + ipSub2D + "." + ipSub3D + "." + ipSub4D; return ip; } } /** * 10进制ip地址格式化为用“.”分隔开字符串 * @param ip 例如“3232235777” * @return 用“.”分隔开ip字符串(不被任何字符分割,例如“192.168.1.1”) * @throws Exception */ public static String decimalToString(Long ipD) throws Exception { String ipH = decimalToHex(ipD); String ip = hexToString(ipH); return ip; } //测试 public static void main(String[] args) { try { String ip = "192.168.1.1"; String ipH = "c0a80101"; long ipD = 3232235777l; System.out.println(IpFormat.stingToHex(ip)); System.out.println(IpFormat.decimalToHex(ipD)); System.out.println(IpFormat.stingToDecimal(ip)); System.out.println(IpFormat.hexToDecimal(ipH)); System.out.println(IpFormat.hexToString(ipH)); System.out.println(IpFormat.decimalToString(ipD)); } catch (Exception e) { e.printStackTrace(); } } }