【问题标题】:What's the simplest way of adding one to a binary string in Perl?在 Perl 中向二进制字符串添加 1 的最简单方法是什么?
【发布时间】:2010-09-18 08:00:27
【问题描述】:

我有一个变量,它包含一个 4 字节的网络顺序 IPv4 地址(这是使用包和整数表示创建的)。我有另一个变量,也是一个 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 结尾。最简单的方法是什么?

有没有办法做到这一点,而不必解包和重新打包变量?

【问题讨论】:

    标签: perl binary math


    【解决方案1】:

    发生的事情是您使用$ip&$netmask 创建一个字节字符串,然后尝试将其视为一个数字。像这样的,这是行不通的。您必须提供给inet_ntoa 的是。

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

    我认为没有更简单的方法。

    【讨论】:

    • 我认为你可能是对的。只是想看看有没有更简单的方法,可惜可能没有。
    【解决方案2】:

    混淆整数和字符串。也许下面的代码会有所帮助:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      • 2018-10-31
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2014-01-03
      相关资源
      最近更新 更多