请教下Inet4Address的getAddress方法的返回结果

sheva_goal 2012-07-07 11:44:33

//关于网络这块我不懂,所以来请教一下.

public static void writeInet4Address(OutputStream output, Inet4Address value, int length) throws RTUException {
// 转化数据
Long lvalue = null;
if (value != null) {
byte[] bytes = value.getAddress();
//debug时候,Inet4Address value的值为:/192.168.1.156
//执行这句后,bytes 内容为[-64, -88, 1, -100],请教下这里是怎么变化/换算的.

if (bytes == null || bytes.length != 4) {
throw new RTUException("不是标准的IPv4地址值.");
}
//还有下面这些内容作用是什么,运行完后lvalue值为:3232235932. 再请教下换算过程.
lvalue = 0l;
lvalue += ((long) (bytes[0] & 0xFF) << 24);
lvalue += ((long) (bytes[1] & 0xFF) << 16);
lvalue += ((long) (bytes[2] & 0xFF) << 8);
lvalue += ((long) (bytes[3] & 0xFF) << 0);
}
}
...全文
322 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
brightyq 2012-07-07
  • 打赏
  • 举报
回复
((long) (bytes[0] & 0xFF) << 24);

bytes[0] & 0xFF 把bytes[0]转成int
<< 24 左移24,右侧补0
(long) 转成long

后面同理了,然后将值累加。
brightyq 2012-07-07
  • 打赏
  • 举报
回复
Inet4Address对象建立之时,有一个变量address已经存下了IP地址的int数据,执行getAddress方法,就将变量的address分成四组数字,并转换成byte返回。楼主可以看下源码返回过程。
wangdong20 2012-07-07
  • 打赏
  • 举报
回复

lvalue = 0l;
lvalue += ((long) (bytes[0] & 0xFF) << 24); //我觉得应该是<<32,这里取bytes最大一位对应的数值
lvalue += ((long) (bytes[1] & 0xFF) << 16); //这里取的是bytes第三位对应的long值
lvalue += ((long) (bytes[2] & 0xFF) << 8); //这里取的是bytes第二位对应的long值
lvalue += ((long) (bytes[3] & 0xFF) << 0); //这里取的是bytes第一位对应的long值

wangdong20 2012-07-07
  • 打赏
  • 举报
回复
//debug时候,Inet4Address value的值为:/192.168.1.156
//执行这句后,bytes 内容为[-64, -88, 1, -100],请教下这里是怎么变化/换算的.


我个人觉得byte的范围是-127~128
这里192超过128,就像有的指针表越界了就重最小值再算,192超出128有64,那这里的64 将从-127开始算起
所以刚好是-64,其他情况类似,而1因为本身没越界所以就是1
ZZZ5512536 2012-07-07
  • 打赏
  • 举报
回复
lvalue = 0l;
lvalue += ((long) (bytes[0] & 0xFF) << 24);
lvalue += ((long) (bytes[1] & 0xFF) << 16);
lvalue += ((long) (bytes[2] & 0xFF) << 8);
lvalue += ((long) (bytes[3] & 0xFF) << 0);

这作用是把ip转化为long型的数值了吧.下面的可以参考下:
http://tdcq.iteye.com/blog/1407169
nmyangym 2012-07-07
  • 打赏
  • 举报
回复
//debug时候,Inet4Address value的值为:/192.168.1.156
//执行这句后,bytes 内容为[-64, -88, 1, -100],请教下这里是怎么变化/换算的.
这没什么换算,"192"的2进制表示是"11000000",因为jav 里byte类行为有符号数,所以把“192”放进一个"byte"里,因其最高位是1,所以就是-64. "168"就是-88,“156”就是-100。
相当于把192 168 1 156 这4个数原封不动放进一个byte[]里了。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧