2010-04-15 3 views
24

У меня нет подсказки, как проверить эту строку. Я просто поставляю IV для шифрования, но не могу найти 1is_hex() 1 или подобную функцию, я не могу обернуть вокруг себя голову! Я читал комментарии в документации PHP это (пользователь CONTRIB заметки.):PHP: Простой, Проверить, является ли строка шестнадцатеричной?

if($iv == dechex(hexdec($iv))) { 
    //True 
} else { 
    //False 
} 

Но это не похоже на работу на всех .. Это говорит только ложь. Если это помогает мой вклад моего IV бы это:

92bff433cc639a6d 

ответ

49

Использование функции: ctype_xdigit

<?php 
$strings = array('AB10BC99', 'AR1012', 'ab12bc99'); 
foreach ($strings as $testcase) { 
    if (ctype_xdigit($testcase)) { 
     echo "The string $testcase consists of all hexadecimal digits.\n"; 
    } else { 
     echo "The string $testcase does not consist of all hexadecimal digits.\n"; 
    } 
} 
?> 

Приведенный выше пример выведет:

  • Строка AB10BC99 состоит из шестнадцатеричных цифр.
  • Строка AR1012 не состоит из всех шестнадцатеричных цифр.
  • Строка ab12bc99 состоит из всех шестнадцатеричных цифр.
+1

Спасибо!Иногда мне редко не нравится регулярное выражение, я рад, что там что-то есть. В следующий раз нужно посмотреть в списке функций. –

3

Есть ли какая-либо причина не совпадать с простым RE, как «[0-9A-Fa-F] +»? (отредактируйте: возможно, с «^» в начале и «$» в конце, чтобы убедиться, что вы соответствовали всей строке).

+0

Я попытался, $ IV = "92bff433cc63da6W" если (preg_match ('/ [0-9A-Fa-f] + /', $ iv)) { $ enc = mcrypt_encrypt (MCRYPT_BLOWFISH, $ key, $ data, MCRYPT_MODE_CBC, упаковка ("H *", $ IV)); $ ENCRSLT = bin2hex ($ enc); } else { $ ENCRSLT = "Ошибка: ключ или IV не является шестнадцатеричным. Допустимые символы: 0-9a-f."; } Но это не подтверждается (очевидный W в конце) –

+0

Упс, комментарии не форматировались, извините. lol –

+0

Перейдите к регулярному выражению: "^ [0-9a-f] $", как предложил Джерри. И отбросьте верхний регистр A-F, поскольку он не поддерживается в соответствии с вставленным вами сообщением об ошибке. –

1

Слишком большой объем ввода. Из PHP руководства dexhex

The largest number that can be converted is 4294967295 in decimal resulting to "ffffffff"

Таким образом, вы будете лучше использовать регулярные выражения, которые уже поставлены здесь другими.

+0

Шестерка была 8-байтовой строкой для IV, а не числом, регулярным выражением и лучшим ctype_xdigit. –

0

Это также возможно, и довольно просто

$a="affe"; //is_hex 
$b="a0bg"; //is_not_hex 

if(is_numeric('0x'.$a)) echo 'is_hex'; 
else echo 'is_not_hex'; 

if(is_numeric('0x'.$b)) echo 'is_hex'; 
else echo 'is_not_hex'; 
+0

И довольно дорого. – caiosm1005

+0

Больше не разрешено в PHP 7, см. «Шестнадцатеричные строки больше не считаются числовыми» http://php.net/manual/en/migration70.incompatible.php –

1

Идеальный способ проверить HEX строки работает с PHP 4 и выше.

<?php 
function is_hex($hex_code) { 
     return @preg_match("/^[a-f0-9]{2,}$/i", $hex_code) && !(strlen($hex_code) & 1); 
} 
?> 
0

Добавить нечувствительности к регистру 'я' флаг

preg_match('/^[0-9a-f]+$/i', ... 
1

Другой способ без ctype или regex:

$str = 'string to check'; 

if (trim($str, '0..9A..Fa..f') == '') { 
    // string is hexadecimal 
}