当前位置:  开发笔记 > 编程语言 > 正文

在Perl中为二进制字符串添加一个最简单的方法是什么?

如何解决《在Perl中为二进制字符串添加一个最简单的方法是什么?》经验,为你挑选了2个好方法。

我有一个包含4字节网络顺序IPv4地址的变量(这是使用pack和整数表示创建的).我有另一个变量,也是一个4字节的网络顺序子网.我正在尝试将它们添加到一起并添加一个以获取子网中的第一个IP.

要获得ASCII表示,我可以inet_ntoa($ip&$netmask)获取基址,但这是一个错误inet_ntoa((($ip&$netmask)+1); 我得到一条消息:

 Argument "\n\r&\0" isn't numeric in addition (+) at test.pm line 95.

所以发生了什么,我能说的最好的是,它正在查看4个字节,并看到4个字节不代表数字字符串,然后拒绝添加1.

放置它的另一种方法:我想要它做的是将最低有效字节加1,我知道是第4个字节?也就是说,我想取字符串\n\r&\0并最终得到字符串\n\r&\1.这样做最简单的方法是什么?

有没有办法做到这一点,而无需解压缩和重新包装变量?



1> Leon Timmerm..:

发生的事情是你用一个字节串$ip&$netmask,然后尝试将它作为一个数字处理.这不会起作用.你要喂的inet_ntoa是什么.

pack("N", unpack("N", $ip&$netmask) + 1)

我认为没有更简单的方法可以做到这一点.



2> Liudvikas Bu..:

令人困惑的整数和字符串.也许以下代码将有所帮助:

use Socket;

$ip = pack("C4", 192,168,250,66); # why not inet_aton("192.168.250.66")
$netmask = pack("C4", 255,255,255,0);

$ipi = unpack("N", $ip);
$netmaski = unpack("N", $netmask);

$ip1 = pack("N", ($ipi&$netmaski)+1);
print inet_ntoa($ip1), "\n";

哪个输出:

192.168.250.1

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有