PHP 프로그래밍에서 Hexdec ()는 육각 문자열을 해당 10 진수 값으로 변환하는 매우 실용적인 기능입니다. 여러 번, 우리는이를 사용하여 색상 코드, 인코딩 및 디코딩 또는 하드웨어 레지스터 값을 처리하는 데 사용합니다. 그러나 일반적인 질문은 다음과 같습니다. hexdec ()를 사용하면 정수 오버플로가 원인이 될까요? **이 기사는 Hexdec ()가 효과적으로 식별하고 우회하는 방법을 유발하고 가르 칠 수있는 정수 오버플로 문제에 대한 심층 분석을 수행합니다.
정수 오버플로는 데이터 유형이 나타내는 최대 범위를 초과하는 정수 값을 나타냅니다. PHP에서 정수의 크기는 시스템 아키텍처에 의해 결정됩니다.
32 비트 시스템 : 최대 정수는 약 231-1 (2147483647)입니다.
64 비트 시스템 : 최대 정수는 약 2? 3-1 (9223372036854775807)입니다.
변환 된 값 이이 범위를 초과하면 오버플로가 발생할 수 있습니다.
hexdec () 의 정의는 간단합니다.
$decimal = hexdec('FF'); // 255
16 진수를 수용하고 소수점 부동 소수점 번호 또는 정수를 반환합니다. 실제로, PHP는 정수 범위보다 큰 Hexdec () 입력을 처리 할 때 플로팅 포인트 번호를 반환합니다.
예:
<?php
// 32 비트 시스템에서,최대 정수 0x7FFFFFFF = 2147483647
echo hexdec('7FFFFFFF') . "\n"; // 2147483647,일반 정수
echo hexdec('80000000') . "\n"; // 2147483648,이상32비트 정수 범위,부동 소수점 번호를 반환합니다
?>
64 비트 시스템에서는이 범위가 더 크지 만 여전히 제한적입니다.
육각형 문자열로 표시되는 값이 현재 시스템의 정수 최대치를 초과하면 PHP는 리턴 값을 부동 소수점 번호로 변환합니다. 부동 소수점 숫자는 더 큰 범위를 나타낼 수 있지만 정확도는 제한되어있어 정확도가 손실 될 수 있습니다.
예를 들어:
<?php
var_dump(hexdec('FFFFFFFFFFFFFFFF')); // 64비트의 최대 부호없는 값
?>
산출:
float(1.8446744073709552E+19)
이것은 PHP 서명 정수의 최대 범위를 초과 한 부동 소수점 번호입니다.
참고 : 정확한 정수를 기대하는 경우 여기에는 정확성 문제가 발생합니다.
오버 플로의 위험을 식별하는 열쇠는 입력 16 진 문자열에 해당하는 값이 시스템의 정수 범위를 초과하는지 여부를 결정하는 것입니다. 문자열 길이를 비교하거나 BC 시리즈 기능을 사용하여 판단 할 수 있습니다.
예:
<?php
function willOverflow($hexString) {
$maxInt = PHP_INT_MAX;
// 将최대 정수转为16 진
$maxHex = dechex($maxInt);
// 16 진수 문자열은 케이스를 무시합니다,길이와 사전 순서 비교
$hexString = strtolower($hexString);
$maxHex = strtolower($maxHex);
if (strlen($hexString) > strlen($maxHex)) {
return true; // 길이가 초과됩니다,오버플로해야합니다
} elseif (strlen($hexString) < strlen($maxHex)) {
return false; // 분명히 오버플로가 없습니다
} else {
// 같은 길이,비교 사전 순서
return strcmp($hexString, $maxHex) > 0;
}
}
// 시험
var_dump(willOverflow('7FFFFFFF')); // false
var_dump(willOverflow('80000000')); // true
?>
문자열 처리 또는 다수 함수 사용 <br> 오버플로가 될 수있는 16 진수의 경우 PHP의 BCMATH 확장 또는 GMP 확장을 사용하는 것이 좋습니다.
<?php
$hex = 'FFFFFFFFFFFFFFFF';
$decimal = gmp_strval(gmp_init($hex, 16), 10);
echo $decimal . "\n";
?>
GMP_INIT는 임의 크기의 수를 정확하게 처리하여 오버플로 및 정밀도 손실을 피할 수 있습니다.
제한 입력 범위 <br> 프로그램이 특정 범위 내에서 16 진수를 처리 해야하는 경우, 입력 할 때 확인하고 범위를 초과하는 데이터를 거부 할 수 있습니다.
숫자 값의 사용을 이해하십시오 <br> 값이 디스플레이 또는 스토리지에만 문자열로 사용되는 경우 Hexdec ()을 사용하여 부동 소수점 번호로 변환하십시오. 수학 연산에 사용되면주의해서 처리해야합니다.
hexdec () 자체는 직접 오버플로가되지 않지만 숫자가 정수 범위를 초과하면 부동 소수점 번호를 반환하여 정밀도 손실을 초래할 수 있습니다.
오버플로가 문자열을 통한 시스템의 최대 정수와 16 진수 값의 크기와 비교 될 수 있는지 여부를 결정합니다.
많은 경우 안전한 취급을 위해 BCMATH 또는 GMP를 사용하는 것이 좋습니다.
주요 시나리오에서 입력 제한 및 유형 검사는 오버플로를 피하기위한 중요한 수단입니다.
이 지식을 마스터하면 16 진수를 다룰 때 "보이지 않는"정수 오버플로 문제를 피하고보다 강력한 PHP 코드를 작성할 수 있습니다.
<?php
// 데모 gmp 오버플로를 피하기 위해 확장하십시오
$hex = 'FFFFFFFFFFFFFFFF'; // 초과하다 64 비트 서명 정수 범위
$decimal = gmp_strval(gmp_init($hex, 16), 10);
echo "16 진 $hex 소수점으로 변환:$decimal\n";
// 사용 hexdec 부동 소수점 번호를 얻을 수 있습니다,제한된 정확도
$floatValue = hexdec($hex);
echo "사용 hexdec 얻은 값:$floatValue\n";
?>