代码之家  ›  专栏  ›  技术社区  ›  Jazzy

来自表单POST的PHP循环十六进制数总是将第一个数字作为0给出。为什么?

  •  0
  • Jazzy  · 技术社区  · 14 年前

    我有一个带有两个文本字段“from”和“to”的表单

    当我输入诸如“100000”和“10000F”之类的值并执行for循环时,它总是显示为:

    0 100001 100002 100003 100004 100005 100006 100007 100008 100009 100000A 10000b 10000c 10000d 10000e 10000f

    如果我手动插入循环的范围,我会得到:

    100000 100001 100002 100003 100004 100005 100006 100007 100008 100009 100000A 10000b 10000c 10000d 10000e 10000f

    使用:

    for ($i = '0x'.$_POST['from']; $i <= '0x'.$_POST['to']; $i++) { print dechex($i)."\n"; }
    

    对:

    for ($i = 0x100000; $i <= 0x10000F; $i++) { print dechex($i)."\n"; }
    

    如果有人知道我做错了什么,请告诉我。

    我也试过用同样的结果通过表单将“x”添加到数字中。

    谢谢!

    5 回复  |  直到 14 年前
        1
  •  3
  •   cdhowie    14 年前

    $i++ 正在转换 $i 对于一个数字,这要等到第一个循环之后才能运行。显然 dechex 不试图将字符串解释为数字,而只是barfs。

    若要强制转换,请在字符串表达式前面加上 + :

    for ($i = +('0x'.$_POST['from']); $i <= '0x'.$_POST['to']; $i++) {
        print dechex($i)."\n";
    }
    

    测试并使用PHP5.2.6。

    (注意铸件不起作用! (int)('0x100000') 回报 0 .)

        2
  •  2
  •   Paige Ruten    14 年前

    你应该用 intval() 将十六进制字符串转换为数字。 dechex() 将数字转换回十六进制字符串:

    $from = intval('100001', 16);
    $to = intval('10000f', 16);
    
    for ($i = $from; $i <= $to; $i++) {
      print dechex($i) . "\n";
    }
    
        3
  •  0
  •   Mark Baker    14 年前

    'x'.$\u POST['from'];是字符串$i=0x100000是数字

    第一次迭代将使用标准PHP casting将字符串值转换为数字(作为第一个非数字字符的整数值,即“x”的起始值为0)

        4
  •  0
  •   simshaun    14 年前

    你也可以

    for ($i = intval('0x'.$_POST['from'], 0); $i <= intval('0x'.$_POST['to'], 0); $i++) { print dechex($i)."\n"; }

        5
  •  0
  •   netcoder    14 年前

    首先需要将十六进制字符串转换为实际整数。有点像 this function does .

    否则,PHP将把它作为字符串处理。