gpt4 book ai didi

php - ip2long ("012.012.012.012") 在 Linux 上返回 false

转载 作者:行者123 更新时间:2023-12-03 20:45:48 27 4
gpt4 key购买 nike

假设 IPv4 地址表示中有前导零,例如 012.012.012.012 .
为了抑制前导零,我简单地编写了以下代码,它在我的 Mac 上按我的预期工作:

% php -r 'var_dump(long2ip(ip2long("012.012.012.012")));'
Command line code:1:
string(11) "12.12.12.12"

% php --version
PHP 7.3.25 (cli) (built: Dec 25 2020 22:03:38) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.25, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.25, Copyright (c) 1999-2018, by Zend Technologies
with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans
但是这段简单的代码在 CentOS 7 上不起作用,好像是 ip2long("012.012.012.012")返回 false值(value):
$ php -r 'var_dump(long2ip(ip2long("012.012.012.012")));'
string(7) "0.0.0.0"

$ php --version
PHP 7.3.25 (cli) (built: Nov 24 2020 11:10:55) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.25, Copyright (c) 1998-2018 Zend Technologies

$ cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
两个 PHP 版本是相同的,我希望它们返回完全相同的值。我还阅读了 ip2long docs并试图查找此行为是否有任何特殊选项/配置,但没有运气。
有人能把我引向正确的方向吗?
是什么让他们与众不同?我该怎么办?

最佳答案

好的,我找到了罪魁祸首。 inet_pton(3)的不同实现LLVM 和 GCC 之间导致这种行为,如 Russ-san commented .有 a bug report大约 6 年前完全相同的问题。看来 PHP v5.2.10 已经开始使用 inet_pton而不是 inet_addr根据 this patch , 这就是为什么 older versions of PHP将每个块视为八进制。
测试.c

#include <stdio.h>
#include <arpa/inet.h>

#define INADDR "012.012.012.012"

int main() {
struct in_addr inaddr;

if (inet_pton(AF_INET, INADDR, &inaddr) == 0) {
printf("Invalid: %s\n", INADDR);
}
else {
printf("Valid: %s\n", INADDR);
}

return 0;
}
  • 苹果机
  • % cc test.cc && ./a.out
    Valid: 012.012.012.012
  • Linux
  • $ cc test.cc && ./a.out
    Invalid: 012.012.012.012
    我放弃使用 ip2long/ long2ip内置函数,现在正在尝试使用 https://github.com/mlocati/ip-lib
    >>> \IPLib\Address\IPv4::fromString("1.2.3.12")->toString(true);
    => "001.002.003.012"
    >>> \IPLib\Address\IPv4::fromString("001.002.003.012")->toString();
    => "1.2.3.12"
    到目前为止没有问题。

    关于php - ip2long ("012.012.012.012") 在 Linux 上返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65719480/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com