php ip2long,Php的ip2long和long2ip

在开发中,经常需要将IP地址转成整型进行保存,这样不仅有利于做索引,并且原本需要15个字节的存储空间,转换后只需4个字节就能存储了。但是很多人对于ip2long的结果有时候是负数并不理解,本文将详细解释这一点。因为ip2long只支持IPv4,所以本文也是基于IPv4来描述和编码的。

右移

逻辑右移

右移多少位,则在高位补多少位0。

算术右移

对无符号数做算术右移和逻辑右移的结果是相同的。但是对一个有符号数做算术右移,则右移多少位,即在高位补多少位1。

注意事项

对于C来说,只提供了>>右移运算符,究竟是逻辑右移还是算术右移这取决于编译器的行为,因此一般只提倡对无符号数进行位操作。

IPv4地址是如何表示的

IPv4使用无符号32位地址,因此最多有2的32次方减1(4294967295)个地址。一般的书写法为用4个小数点分开的十进制数,记为:A.B.C.D,比如:157.23.56.90。

IPv4地址转换成无符号整型

blog_160965eee0102ylep.html

IPv4地址的每一个十进制数都为无符号的字节,因此范围在0~255,将IPv4地址转成无符号整型其实就是将每个十进制数放在对应的8位上组成一个4字节的无符号整型。依上图表示:157在高8位,90在低8位,23和56在中间对应的8位上。来看一个C实现的例子:

#include

int main(int argc, char** argv)

{

unsigned int ip_long = (157 <

printf("%u\n", ip_long);

printf("%d\n", ip_long);

return 0;

}

$ gcc -o ip2long main.c

$ ./ip2long

2635544666

-1659422630

可以看到,即使ip_long声明为无符号整型,在输出时也需要指明%u来格式化输出为无符号整型。这是因为157大于127(二进制为01111111),也就是说如果157(8位)用二进制来表示,最高位必然是1。当将157放在一个4字节整型的高8位时,导致这个4字节整型的最高位为1。虽然ip_long定义为无符号整型,但printf函数并不知道,因此需要指明无符号格式化字符。如果最高位为0,则使用%d就可以了,来看另一个例子:

#include

int main(int argc, char** argv)

{

unsigned int ip_long = (120 <

printf("%u\n", ip_long);

printf("%d\n", ip_long);

return 0;

}

$ gcc -o ip2long main.c

$ ./ip2long

2014787674

2014787674

PHP是如何做的

现在已经知道了为什么会出现负数。对于动态类型语言来说,数据类型一般是有符号的,所以需要我们自己转成无符号整型。PHP有内置函数ip2long来将IPv4地址转换成整型,也提供了类C的sprintf方法,因此很容易解决出现负数的问题:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值