是王小二呀
2015-12-12 10:27
byte[]来存IP地址不够啊,超过128变-负的了,Java就是规定只能用byte吗,怎么用int[]j接收getAddress()报错呢??
首先InetAddress.getLocalHost() 这个方法返回的就是byte[]数组,这个没法改。
其次ipv4是4个0-255间的整数组成的,byte是1字节8 位,正好满足(2的8次方=256),所以用byte去接是合适的。
但由于java中没有unsigned的类型,所有数都是带有正负位的,所以最高位的 1 将会被解释为符号位,另外 Java 中存储是按照补码存储,如果是地址中一个是135,转二进制 1000 0111 ,这会被java认为是补码形式,转换成原码便是 1111 0001,转换成十进制数便是 -121。
你没法使用byte直接输出地址,必须转为更高级的类型。将 byte 数组中的值与 0xFF 按位与(&),过程中 byte 会隐式类型转换为 int,当与 0xFF 按位与的时候,会将除了低 8 位的其他位全部置 0,这样一来便将符号扩展的那些高位清除掉了。
明白了 Thx
用byte去接还不是一样么,你要另起一个int[]去接
InetAddress myInetAddess; byte[] byteArray=new byte[myInetAddress.getAddress()] for(int i=0;i<myInetAddress.getAddress();i++){ byte[i]=byte[i]&(0xFF);//也就是说四个中只要有一个字节最高位为1的时候就需要这么隐式转换吗? }
Java Socket应用---通信是这样练成的
125013 学习 · 590 问题
相似问题