关于在网络编程是IP地址是否要带点发送的问题,自己的一点看法

4 篇文章 0 订阅
3 篇文章 0 订阅

首先,IP地址是点分十进制表示,点只是作为一个分割符区分。

真正有用的部分是数值。在cmd窗口下测试:192.168.1.100(一台局域网内工作机)

将192.168.1.100转换为不带点的十进制为:C0A80164,在将该十六进制转换为十进制为:3232235876

 

 

分别ping如下内容:

1.192.168.1.200

2.COA80164

3.3232235876

4.C0.A8.01.64

结果分别如下:

 

 

 

 

 

 

 

 

 

 

通过实验可以猜测在通讯是ip地址是没必要发送点的(3232235876等价于192.168.1.100)只要按权值将IP转换为十进制(权值:24 16 8 0)

转换过程如下:192.168.1.100->192*2^24+168*2^16+1*2^8+100*2^0 = 3221225472 + 11010048 + 256 + 100 = 3232235876

 

将3232235876或C0A80164还原为192.168.1.100过程只需按权值作逆过程即可(其实不管是用的是十进制也好十六进制也好在转换的时候都是用的二进制运算,这是运算器的工作,具体怎么工作不是我们关心的)。

假设令a = 3232235876, (a>>24)&0xFF,(a>>16)&0xFF,(a>>8)&0xFF,a&0xFF还原为:192,168,1 ,3

 

mfc中可以用Format函数将点加上以作为分隔:

strAddr.Format("%d.%d.%d.%d",(naddr>>24)&0xFF,(naddr>>16)&0xFF,(naddr>>8)&0xFF,naddr&0xFF);

 

 

 

在工业通讯中,如果需要发点,其实也不难,因为在国际规定的IP地址形式中,‘.’作为一个分隔符是不变化的。所以只需要将IP转换为长度固定的形式即可。现有如下两种转换形式:

1. 直接将ip转换为ASCII码的十六进制形式:

192.168.1.100 -> 31 39 32 2E 31 36 38 2E 31 2E 31 30 30

显然这种转换长度会随着ip变化而变化

2. 先将ip转换为十六进制形式(ip为点分十进制,故名,ip里的数是十进制的)

192.168.1.100 –> C0.A8.01.64

在转换为ASCII码的十六进制发送,这样长度就固定了,因为ip最大也就是255.255.255.255(FF.FF.FF.FF)

C0.A8.01.64 ->43 30 2E 41 38 2E 30 31 2E 36 34 

但是这样的话在收到这样数据的时候就不能用权值逆算法解析了,言外之意也就不能使用Format函数了。

 

如果是不发送点的话解析时就简单些,只需将权值除去即可。(右移为除)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值