黑马程序员技术交流社区

标题: 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