2010-04-15 12 views
24

Nie mam pojęcia, jak sprawdzić ten ciąg. Po prostu dostarczam IV do szyfrowania, ale nie mogę znaleźć 1is_hex() 1 lub podobnej funkcji, nie mogę tego objąć! Czytałem o komentarz w tej dokumentacji php (contrib użytkownik notatki.):PHP: Proste, sprawdź, czy ciąg jest hexem?

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

Ale to nie wydają się działać w ogóle .. To tylko mówi fałszywe. Jeśli to pomaga mój wkład mojego IV byłoby to:

92bff433cc639a6d 

Odpowiedz

49

Zastosowanie funkcji: 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"; 
    } 
} 
?> 

Powyższy przykład wyświetli:

  • Ciąg AB10BC99 składa się ze wszystkich cyfr szesnastkowych.
  • Ciąg znaków AR1012 nie składa się z wszystkich cyfr szesnastkowych.
  • Ciąg ab12bc99 składa się z wszystkich cyfr szesnastkowych.
+1

Dziękujemy!Po prostu nie lubię używać wyrażeń regularnych, cieszę się, że było tam coś nagiego. Po następnym czasie musisz przejrzeć listę funkcji. –

3

Czy jest jakiś powód, by nie zgadzać się z prostego RE jak "[0-9a-FA-f] +"? (edytuj: prawdopodobnie z "^" na początku i "$" na końcu, aby upewnić się, że dopasowałeś cały ciąg).

+0

Próbowałem, $ iv = "92bff433cc63da6W" if (preg_match ('/ [0-9A-Fa-f] + /', $ iv)) { $ enc = mcrypt_encrypt (MCRYPT_BLOWFISH, $ key, $ data, MCRYPT_MODE_CBC, pack ("H *", $ iv)); $ ENCRSLT = bin2hex ($ enc); } else { $ ENCRSLT = "Błąd: Klucz lub IV nie ma szesnastkowych znaków. Poprawne znaki: 0-9a-f."; } Ale nie sprawdza (oczywiste W na końcu) –

+0

Ups, komentarze nie formatują, przepraszam. lol –

+0

Przejdź do wyrażenia regularnego: "^ [0-9a-f] $" zgodnie z sugestią Jerry'ego. I upuść wielką literę A-F, ponieważ nie jest obsługiwana zgodnie z wklejonym komunikatem o błędzie. –

1

Twoje dane wejściowe są zbyt duże. Z podręcznika PHP dexhex

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

Więc będziesz lepiej wyłączyć za pomocą regex, które zostały już dostarczonego tutaj przez innych.

+0

Heks był ciągiem 8-bajtowym dla IV, a nie liczbą, regex i lepszy ctype_xdigit wykonali zadanie. –

0

Jest również możliwe i bardzo proste

$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

I dość drogie. – caiosm1005

+0

Nie jest już dozwolone w PHP 7, zobacz "Łańcuchy szesnastkowe nie są już uważane za cyfry" http://php.net/manual/en/migration70.incompatible.php –

1

To doskonały sposób by sprawdzić HEX pracuje z PHP 4 i powyżej.

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

Dodaj wielkości liter 'i' flag

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

Innym sposobem bez ctype lub regex:

$str = 'string to check'; 

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