如何检测整数十六进制值,如0x0a

时间:2016-01-25 16:06:13

标签: php string integer

我有一个工作函数(我认为)正确检测有效整数,如(int) 0, -1, +1(string) '0', '-1', '+1',但函数失败,十六进制值也被检测为整数。这意味着如果我将整数值0x0a传递给函数,它将返回true。这仅影响if (is_int($input) === true) {部分。我怎样才能避免这种情况发生?

工作示例:

function isInteger($input)
{
    if (is_scalar($input) === false) {
        return false;
    }

    if (intval($input) == $input) {
        if (is_string($input) === true && ctype_digit(ltrim($input, '+-')) === true) {
            return true;
        } else
        if (is_int($input) === true) {
            return true;
        }
    }

    return false;
}

2 个答案:

答案 0 :(得分:2)

我认为你在这里混淆了一些术语。 0x0a是一个整数 - 它相当于十进制10。您没有尝试检测整数,而是试图检测整数的十进制表示,这是另一回事。

在PHP中,与许多其他语言一样,整数是整数。在引擎盖下,所有这些值都是等效的并以相同的方式存储在内存中

10         # decimal
012        # octal
0x0a       # hexadecimal
00001010   # binary

大多数这些语言都是用C或C ++实现的,并使用其中一个C int系列来存储这些值。

即使您可以使用其他格式(如八进制或十六进制)指定它们,并且可以将它们格式化为输出,它们仍然是内存中的整数值。

我怀疑你最好的选择是使用正则表达式。但是,这取决于是否有可用的字符串表示。因为猜测当你将整数转换为字符串时会发生什么......是的,你得到十进制表示。

echo strval(0x0a);
# outputs "10"

在PHP中显示此问题的示例:

$x = 10;
$y = 012;
$z = 0x0a;

echo "x:$x y:$y z:$z\n";

foreach (array(10, 012, 0x0a) as $i) {
    echo var_dump($i);
    echo var_export($i) . "\n";
}

输出:

  

x:10 y:10 z:10
  INT(10)
  10个
  INT(10)
  10个
  INT(10)
  10

在这种情况下,PHP并不是唯一的。其他语言表现完全相同。

的Python

w = 10
x = 0o12
y = 0x0a
z = 0b1010

print('w:{} x:{} y:{} z:{}'.format(w, x, y, z))

for i in (10, 0o12, 0x0a, 0b1010):
    print(repr(i), i)

输出:

  

w:10 x:10 y:10 z:10
  10 10
  10 10
  10 10
  10 10

的Perl

use strict;
use Data::Dumper;

my $x = 10;
my $y = 012;
my $z = 0x0a;

print "x:$x y:$y z:$z\n";

for my $i (10, 012, 0x0a) {
    print Dumper($i);
}

输出:

  

x:10 y:10 z:10
  $ VAR1 = 10;
  $ VAR1 = 10;
  $ VAR1 = 10;

C

#include <stdio.h>

int main(void) {

    int x = 10;
    int y = 012;
    int z = 0x0a;

    printf("%d %d %d\n", x, y, z);
    printf("0%o 0%o 0%o\n", x, y, z);
    printf("0x%x 0x%x 0x%x\n", x, y, z);

    return(0);

}

输出:

  

10 10 10
  012 012 012
  0xa 0xa 0xa

答案 1 :(得分:0)

正如@Dan Lowe所写:

  

据我所知,这是不可能发现的。十六进制,八进制,二进制表示只是格式化。整数始终是内存中的数值。许多语言都是相同的,例如在这种情况下,Python会做同样的事情,如x = 0x0a;打印(X); - 将返回10作为结果。