我怀疑这可能是重复的,但是如果我能找到的话,领主。
我需要转换一个'在_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
传递的十六进制值转换为字符串,然后转换为十六进制值 - 我将负债。
答案 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
。
不确定我是否回答了你的问题。