HEX 문자열로 작업 할 때 PHP는 16 진수를 10 진수로 변환하는 내장 기능 Hexdec () 을 제공합니다. 그러나 Hexdec ()를 사용할 때 많은 개발자들은 무의식적으로 "0x"접두사 (예 : "0xff" )가있는 문자열을 입력하지만, 반환 된 값이 예상되는 255가 아니라 0.이 상황은 종종 사람들이 혼란스러워한다는 것을 알게 될 것입니다.
이 기사는이 현상을 깊이 분석하고 사용하는 올바른 방법을 제공합니다.
PHP의 hexdec () 함수는 "순수한 헥스 문자열"을 처리하도록 설계되었습니다. 즉, 0–9 및 a – f (case insensitive)와 같은 문자 만 입력으로 받아들입니다. 전달 된 문자열에 16 진 문자 세트에 속하지 않는 컨텐츠가 포함 된 경우, PHP는 문자열의 시작부터 첫 번째 불법 문자가 발생할 때까지 읽은 다음 이전의 합법적 인 부분을 자르고 변환합니다.
<?php
echo hexdec("FF"); // 산출: 255
?>
이것은 기대치를 충족시키는 전형적인 예입니다.
이제 문제의 근본 원인을 보겠습니다.
<?php
echo hexdec("0xFF"); // 산출: 0
?>
현재 출력은 255가 아니지만 0입니다. 이유는 간단합니다. hexdec ()가 첫 번째 불법 캐릭터를 만나면 구문 분석을 중지하고 문자열 "0xff" 의 첫 번째 문자는 0 이며 합법적입니다. 두 번째 문자는 X 이며 불법 16 진 문자입니다. 따라서 PHP는 첫 번째 문자 0 만 구문 분석하므로 0을 반환합니다.
많은 프로그래밍 언어 (예 : C/C ++, JavaScript, Python)에서 "0x" 접두사가있는 쓰기 메소드는 합법적 인 16 진수 형식입니다. 따라서 일부 개발자는 PHP 가이 접두사를 인식하지 못한다는 것을 깨닫지 않고 자연스럽게 PHP의 Hexdec () 에 "0xff"를 PHP의 Hexdec ()로 전달합니다.
일반적이고 간단한 솔루션은 ltrim ()을 사용하여 문자열을 처리하여 가능한 "0x" 또는 "0x" 접두사를 제거하는 것입니다.
<?php
$input = "0xFF";
$clean = ltrim($input, "0xX"); // 모든 것을 제거합니다 "0", "x", "X" 시작 캐릭터(부정확합니다)
echo hexdec($clean); // 산출: 255
?>
그러나 Ltrim ( "0x0f", "0xx")이 "f"를 얻을 수 있기 때문에 이러한 글쓰기 방식에는 함정이 있습니다. 더 안전한 방법은 preg_replace ()를 사용하여 접두사를 정확하게 제거하는 것입니다.
<?php
$input = "0xFF";
$clean = preg_replace('/^0x/i', '', $input);
echo hexdec($clean); // 산출: 255
?>
이것은 숫자 자체를 파괴하지 않고 시작 "0x" 또는 "0x" 만 제거합니다.
URL에서 매개 변수를 처리 할 때 특히 https://gitbox.net/api?color=0xff00ff 와 같은 주소에서 16 진수 문자열이 발생하면 다음과 같은 특별한주의를 기울여야합니다.
<?php
$hex = $_GET['color']; // 예를 들어: 0xFF00FF
$hex = preg_replace('/^0x/i', '', $hex);
$decimal = hexdec($hex);
echo $decimal; // 산출: 16711935
?>
이를 통해 "0x" 접두사로 16 진수 숫자를 올바르게 구문 분석 할 수 있습니다.
PHP의 hexdec () 는 "0x" 접두사를 인식하지 못하며 문자열을 순수한 16 진 문자 모음으로 만 취급합니다. 따라서 Hexdec ()을 사용하기 전에 개발자는 잘못된 값을 얻지 않도록 문자열을 수동으로 청소하고 "0x" 접두사를 제거해야합니다. 이 세부 사항을 이해하고 처리하는 것은 PHP 프로그램의 정확성을 보장하는 핵심입니다.