转换' $ _ GET'十六进制值(字符串形式)到十六进制int - 如何?

时间:2014-05-09 04:17:08

标签: php hex decimal

我怀疑这可能是重复的,但是如果我能找到的话,领主。

我需要转换一个'在_GET[]数组中从字符串传递到实际十六进制整数的十六进制值。我说'大多数'因为传入的十六进制数不会以" 0x"

为前缀

我尝试过最有希望然后在这个问题上提出白旗的是这个 - ' azk'是传入的GET[]参数的名称:

   $timeStamp = filter_input(INPUT_GET, 'azk', FILTER_SANITIZE_STRING); 

   //FAILS FOR HEX -->  $test = (int)$timeStamp;
   //FAILS FOR HEX -->  $test =  0 + $timeStamp;

   $retval =  sscanf($timeStamp, '%x', $test);
   var_dump(gettype($test));
   var_dump($test);

这里发生了什么:用户传入了一个' azk' 531cb6d6 的值,实际上是一个十六进制值,但没有添加' 0x'。

尽管上面有sscanf()的说明,但请注意我明确指示sscanf()转换' timeStamp'通过'%x'到十六进制值国旗 -

- 通过上面的var_dump显示$test值,如下所示:

   string(7) "integer" int(1394390742)   

' 1394390742'是不是十六进制。我没有看到原因,我特意指示sscanf转换为%x十六进制值,但是这个' 1394390742'是传入的base-16(十六进制)值的基数为10(十进制)的版本, 531cb6d6 值。换句话说,使用"%x"将十六进制转换为十进制。不确定这是否是一个错误,某个地方的Web服务器ini文件中的设置,或者我对#34;%x"

的理解不足。

sscanf()并非我所有人都尝试过,这并非详尽无遗,但我尝试过这样的事情,对我来说是最明显的选择:

   // BOTH OF THESE FAIL TO PASS HEX CHARS, BOTH RETURN THIS:   53166
 $timeStamp = filter_input(INPUT_GET, 'azk', FILTER_SANITIZE_NUMBER_INT,
                             FILTER_FLAG_ALLOW_HEX);

 $timeStamp = filter_input(INPUT_GET, 'azk', FILTER_VALIDATE_INT, 
                             FILTER_FLAG_ALLOW_HEX);

我看了很多SO帖子,我无法相信这些不被覆盖,但我无法找到它。如果有人知道如何解决此问题 - 将_GET传递的十六进制值转换为字符串,然后转换为十六进制值 - 我将负债。

2 个答案:

答案 0 :(得分:2)

正如var_dump所示,变量$ test包含一个整数 PHP正在将整数转换回十进制字符串,因此它可以显示它,但整数本身不是本机十进制,也不是十六进制。这些只是两个可能的相同值的表示 如果要将值作为十六进制字符串输出,可以使用以下方法之一:

echo dechex($test);
printf("%x", $test);

编辑:我看到了你的评论,你不需要转换为int:
1)hexdec获取字符串并返回一个整数
2) ...使用整数进行数学计算......
3)dechex将结果作为整数返回一个字符串

答案 1 :(得分:0)

您可以使用hexdec()功能:

$timeStamp = hexdec('531cb6d6'); // 1394390742

如果您想在使用之前清理字符串,那么您可以使用回调创建自己的过滤器:

$hexTimestamp = filter_input(INPUT_GET, 'azk', FILTER_CALLBACK, array(
    'options' => function($str) {
        return ctype_xdigit($str) ? $str : 0;
    }
));
$timeStamp = hexdec('531cb6d6');

如果您不打算使用HEX值,那么您也可以将其转换为整数,作为清理的一部分:

$timestamp = filter_input(INPUT_GET, 'azk', FILTER_CALLBACK, array(
    'options' => function($str) {
        return ctype_xdigit($str) ? hexdec($str) : false;
    }
));

修改

好吧,我觉得我很困惑。你有一个十六进制输入,你想把它变成一个“十六进制数”。我不确定我明白你的意思。

如果您希望输入HEX值成为“真正的”PHP HEX值,例如0x531cb6d6,那么您错误地了解PHP的工作原理。当PHP看到HEX常量时,如0x531cb6d6,它会立即将其转换为整数。 PHP不使用十六进制数字; HEX表示法只是表示数字的一种方式,它实际上并不是一种与整数不同的数字。

如果您希望输入的HEX值"531cb6d6"看起来像带有0x前缀的HEX值,那么您只需添加它:'0x'.$timeStamp

不确定我是否回答了你的问题。