VC的源码是这样:INT转IPstd::string intToIPAddr(uint IPAddr){ char buf[20] = "\0"; sprintf(buf, "%d.%d.%d.%d", (0X000000FF & (IPAddr >> 24)), (0X000000FF & (IPAddr >> 16)), (0X000000FF & (IPAddr >> 8)), (0X000000FF & IPAddr )); std::string ip(buf); return ip;}求高手将其改为Java版的.感谢为盼.
throws IllegalArgumentException { int[] oMask = { 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff };
StringBuffer szIP = new StringBuffer(); for (int i = 0; i < 4; i++) {
long iTmp = (argLongIp & oMask[i]); iTmp >>>= (8 * (3 - i));
if (iTmp > 255) {
throw new IllegalArgumentException("Invalid Ip format");
}
szIP.append(iTmp);
if (i == 3) {
break;
}
szIP.append(".");
}
return szIP.toString(); }
你写的这个方法还是有点问题,请您再测试一下。 我的当我的IP为192.168.0.111时,我将得到long值为-1062731665 而再-1062731665用你的方法还原时,会报错误。
{
private static long ipToLong(String strIP)
//将127.0.0.1 形式的IP地址转换成10进制整数
{
int j=0;
int i=0;
long [] ip=new long[4];
int position1=strIP.indexOf(".");
int position2=strIP.indexOf(".",position1+1);
int position3=strIP.indexOf(".",position2+1);
ip[0]=Long.parseLong(strIP.substring(0,position1));
ip[1]=Long.parseLong(strIP.substring(position1+1,position2));
ip[2]=Long.parseLong(strIP.substring(position2+1,position3));
ip[3]=Long.parseLong(strIP.substring(position3+1));
return (ip[0]<<24)+(ip[1]<<16)+(ip[2]<<8)+ip[3]; //ip1*256*256*256+ip2*256*256+ip3*256+ip4
}
private static String longToIP(long longIP)
//将10进制整数形式转换成127.0.0.1形式的IP地址,在命令提示符下输入ping 3396362403L
{
StringBuffer sb=new StringBuffer("");
sb.append(String.valueOf(longIP>>>24));//直接右移24位
sb.append(".");
sb.append(String.valueOf((longIP&0x00FFFFFF)>>>16)); //将高8位置0,然后右移16位
sb.append(".");
sb.append(String.valueOf((longIP&0x0000FFFF)>>>8));
sb.append(".");
sb.append(String.valueOf(longIP&0x000000FF));
sb.append(".");
return sb.toString();
}
public static void main(String[] args)
{
System.out.println("IP地址的各种表现形式:\r\n");
System.out.print("32位二进制形式:");
System.out.println(Long.toBinaryString(3396362403L));
System.out.print("十进制形式:");
System.out.println(ipToLong("202.112.96.163"));
System.out.print("普通形式:");
System.out.println(longToIP(3396362403L));
}
}
{
public static String IP2Long(String strIP) {
String[] strTemp=strIP.split("\\.");
long IPCount1=(long)(Integer.parseInt(strTemp[0])*256*256*256
+Integer.parseInt(strTemp[1])*256*256
+Integer.parseInt(strTemp[2])*256
+Integer.parseInt(strTemp[3]));
return String.valueOf(IPCount1);
}
}
Java里没有unsigned int。
------------
if(i<0)
i+=256;
这样就解决了unsigned int的问题了
晨星大哥,下面就交给你了啊
因为楼主原来的函数参数就是uint,嘿嘿。
class ArgCollector {
private final LinkedList args = new LinkedList();
private String format;
ArgCollector(String format) {this.format = format;}
ArgCollector arg(BigInteger arg) {
args.addFirst(arg);return this;
} String flush() {
String ret = new MessageFormat(format).format(args.toArray());
args.clear();
return ret;
} ArgCollector format(String arg) {
format = arg;
return this;
};
} // Java 表示大数.
int[] a = { 192, 168, 0, 243, 123, 232, 234, 112, 232, 111, 23 }; BigInteger IP = BigInteger.valueOf(1);
BigInteger m = BigInteger.valueOf(255);
String format = "";
for (int i = 0; i < a.length; i++) { //构造一个超大数:520413995593885487931458753
IP = IP.multiply(m).add(BigInteger.valueOf(a[i]));
format += "{" + i + "}";
if (i != a.length - 1)
format += ".";
} System.out.println(IP); ArgCollector arg = new ArgCollector(format); for (int i = 0; i < a.length; i++) {
BigInteger[] tmp = IP.divideAndRemainder(m); // 商在前,余在后.
IP = tmp[0];
System.out.println(" xx :" + tmp[1]);
arg.arg(tmp[1]);
} System.out.println(arg.flush());
}
return (0XFF & (n >> 24)) + "." + (0XFF & (n >> 16)) + "." + (0XFF & (n >> 8)) + "." + (0XFF & n);
}
long longIP = -1062731665;
StringBuffer sb=new StringBuffer("");
sb.append(String.valueOf((longIP>>>24)&0xFF));//直接右移24位
sb.append(".");
sb.append(String.valueOf((longIP&0x00FFFFFF)>>>16)); //将高8位置0,然后右移16位
sb.append(".");
sb.append(String.valueOf((longIP&0x0000FFFF)>>>8));
sb.append(".");
sb.append(String.valueOf(longIP&0x000000FF));
sb.append(".");
System.out.println(sb.toString());
}
{
public static String IP2Long(String strIP) {
String[] strTemp=strIP.split("\\.");
long IPCount1=(long)(Integer.parseInt(strTemp[0])*256*256*256
+Integer.parseInt(strTemp[1])*256*256
+Integer.parseInt(strTemp[2])*256
+Integer.parseInt(strTemp[3]));
return String.valueOf(IPCount1);
}
public static String Long2IP(String strLong) {
long longIP = (long)Integer.parseInt(strLong);
StringBuffer sb=new StringBuffer("");
sb.append(String.valueOf((longIP>>>24)&0xFF));
sb.append(".");
sb.append(String.valueOf((longIP&0x00FFFFFF)>>>16));
sb.append(".");
sb.append(String.valueOf((longIP&0x0000FFFF)>>>8));
sb.append(".");
sb.append(String.valueOf(longIP&0x000000FF));
return sb.toString();
}
}