Php 转换为'$_获取';十六进制值(字符串形式)到十六进制整数——如何转换?

Php 转换为'$_获取';十六进制值(字符串形式)到十六进制整数——如何转换?,php,hex,decimal,Php,Hex,Decimal,我怀疑这可能是复制品,但如果我能找到的话 我需要将\u GET[]数组中传递的“大部分”十六进制值从字符串转换为实际的十六进制整数。我之所以说“大部分”,是因为传入的十六进制数前面没有“0x” 我尝试过的最有希望的事情是--“azk”是传入的GET[]参数的名称: $timeStamp = filter_input(INPUT_GET, 'azk', FILTER_SANITIZE_STRING); //FAILS FOR HEX --> $test = (int)$ti

我怀疑这可能是复制品,但如果我能找到的话

我需要将
\u 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()
通过“%x”标志将“timeStamp”的值转换为十六进制值--

--
$test
值通过上述变量转储显示如下:

   string(7) "integer" int(1394390742)   
“1394390742”不是十六进制。我不明白为什么,我特别指示sscanf转换为%x十六进制值,但这个“1394390742”是传入的base-16(十六进制)值的十进制版本,531cb6d6值。换句话说,使用“%x”就是将十六进制转换为十进制。不确定这是否是一个bug、某个web服务器ini文件中的设置,或者我对“%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帖子,我不敢相信这篇文章没有被涵盖,但我找不到。如果有人知道如何实现这一点——将
\u GET
传递的十六进制值转换为字符串,然后转换为十六进制值——我将欠你的债。

你可以使用
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');
如果不打算使用十六进制值,则还可以将其转换为整数,作为消毒的一部分:

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

好吧,我想我有点糊涂了。你有一个十六进制输入,你想把它变成一个“十六进制数”。我不太明白你的意思

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

如果希望输入的十六进制值“
”531cb6d6“
”看起来像是带有
0x
前缀的十六进制值,则只需添加它:
'0x.$timeStamp


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

正如var\u dump所示,变量$test包含一个整数。
PHP将整数转换回十进制字符串只是为了显示它,但整数本身并不是十进制的,也不是十六进制的。这只是相同值的两种可能表示形式。
如果要将值输出回十六进制字符串,可以使用以下选项之一:

echo dechex($test);
printf("%x", $test);
编辑:我看到了您的评论,您不需要强制转换为int:
1) hexdec接受字符串并返回一个整数
2) …使用整数进行计算…

3) dechex将结果作为一个整数,返回一个字符串

不确定,但我认为您误解了;我有一个十六进制字符串输入,需要转换成十六进制数。不确定为什么建议使用hexdec(),原因有两个:(1)我实际上是在尝试从十进制转换为十六进制,因为我(目前)还没有尝试过将传入的十六进制字符串直接转换为十六进制整数;(2)dechex()和hexdec()都返回字符串,我需要将传入的十六进制字符串转换为整数形式(十六进制)。我非常感谢你的努力,在阅读了你的答案后,我很兴奋,并尝试在sscanf值上使用“dechex()”,但dechex返回一个字符串。你所说的“十六进制整数”是什么意思?以16为基数,而不是以10为基数,数学。a+a=14。10 + 10 = 20. 差别很大。好吧,但PHP不使用base 16。十六进制表示法只是一种表示数字的方法。当PHP看到一个十六进制数时,如
0x531cb6d6
,它会立即转换为一个整数。这是我的拿手好戏。八进制、二进制、十六进制只能作为字符串使用。在内部,基线是以10为基数的数字系统。如果你有其他的基数(八进制,十六进制),所有的数学运算都必须以10为基数,任何转换都由我负责。如果我有一个十六进制值的数据库,在进行数学运算之前需要进行转换。这个问题让我很好奇,但我对你想要实现的目标有点困惑。恕我直言,
hex int
到底是什么样子的?你想要打印什么?
var\u dump($test)
?简而言之,$val=(int)$myHexNumAsString不起作用,我必须先调用hexdec(),然后强制转换。如果您查看我上面的原始示例代码,则base-10字符串的转换成功,base-16字符串的转换失败。对于以16为基数的数据库,我必须(1)调用hexdec()将十六进制转换为十进制,然后(2)转换为(int)并进行计算。如果我可以避免在开始计算之前调用hexdec(),那就太酷了,最好有(int-x)之类的类型转换。我还必须转换和强制转换十六进制输入值。换句话说,当我使用“%x”格式时,sscanf()实际上正在工作?不管出于什么原因,var_dump()只能显示任意整数的10进制格式,并且为了显示它而麻烦地将我的sscanf()“%x”十六进制(以16进制为基数)结果转换为十进制?没错:带有%x的sscanf将字符串解析为十六进制数字序列。