黑马程序员技术交流社区
标题:
InetAddress 接收字节数组疑问
[打印本页]
作者:
庄星睿
时间:
2012-8-28 10:41
标题:
InetAddress 接收字节数组疑问
IPv4 地址 byte 数组的长度必须为 4 个字节,IPv6 byte 数组的长度必须为 16 个字节
InetAddress 中的
public static
InetAddress
getByAddress
(byte[] addr) throws UnknownHostException
在给定原始 IP 地址的情况下,返回 InetAddress 对象。参数按网络字节顺序:地址的高位字节位于 getAddress()[0] 中,这个方法可以接收一个字节数组
比如:byte[] adr = {127,0,0,1};
InetAddress i = InetAddress.getByAddress(adr);
System.out.println(i.getHostName());
但byte类型的数据的取值范围是-128 ~ 127的,ip地址已经超过这个范围了,直接往数组里装肯定不行,那么这里怎么将IP地址转换成byte[]类型的数组?
作者:
追梦黑马
时间:
2012-8-28 10:45
我曾经也遇到过类似的问题
public class TestIPEnCode extends TestCase{
/**
* 把IP地址转换成4字节的数组
*/
public void testEnCodeIp(){
String ip="192.168.1.0";
String [] ips=ip.split("[.]");
byte [] ipbs=new byte[4];
//IP地址压缩成4字节,如果要进一步处理的话,就可以转换成一个int了.
for(int i=0;i< 4 ;i++){
int m=Integer.parseInt(ips[i]);
byte b=(byte) m;
if(m>127){
b=(byte)(127-m);
}
System.out.println(b);
ipbs[i]=b;
}
//把4字节的数组解成IP
ip="";
for(int i=0;i< 4;i++){
String tmp=String.valueOf(ipbs[i]);
if(ipbs[i]< 0){
tmp=String.valueOf(127+Math.abs(ipbs[i]));
}
if(i< 3){
ip+=tmp+".";
}else{
ip+=tmp;
}
}
System.out.println(ip);
}
}
作者:
庄星睿
时间:
2012-8-28 23:21
追梦黑马 发表于 2012-8-28 10:45
我曾经也遇到过类似的问题
public class TestIPEnCode extends TestCase{
理解了,其实把ip地址封装成长度为4个字节的byte数组,不用考虑大于127的情况,直接byte强转取后八位就可以了,如果if(m>127){b=(byte)(127-m);},解析结果又有问题了
测试如下
String ip = "192.251.1.200";
System.out.println(InetAddress.getByName(ip).getHostAddress()); //结果127.0.0.1
String[] ips = ip.split("\\.");
byte[] ipbs = new byte[4];
for(int i=0; i<ips.length;i++)
{
byte b = (byte)Integer.parseInt(ips
); //只要后八位
ipbs
= b;
}
//遍历一下byte数组
for(byte bi : ipbs)
{
System.out.println(bi);
} // -64,-5,1,-56
//传入byte数组,解析IP
System.out.println(InetAddress.getByAddress(ipbs).getHostAddress());//192.251.1.200
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2