현재 위치: > 최신 기사 목록> HexDEC로 인한 정수 오버플로를 피하는 방법은 무엇입니까?

HexDEC로 인한 정수 오버플로를 피하는 방법은 무엇입니까?

gitbox 2025-05-29

PHP 프로그래밍에서 Hexdec ()는 육각 문자열을 해당 10 진수 값으로 변환하는 매우 실용적인 기능입니다. 여러 번, 우리는이를 사용하여 색상 코드, 인코딩 및 디코딩 또는 하드웨어 레지스터 값을 처리하는 데 사용합니다. 그러나 일반적인 질문은 다음과 같습니다. hexdec ()를 사용하면 정수 오버플로가 원인이 될까요? **이 기사는 Hexdec ()가 효과적으로 식별하고 우회하는 방법을 유발하고 가르 칠 수있는 정수 오버플로 문제에 대한 심층 분석을 수행합니다.


정수 오버플로 란 무엇입니까?

정수 오버플로는 데이터 유형이 나타내는 최대 범위를 초과하는 정수 값을 나타냅니다. PHP에서 정수의 크기는 시스템 아키텍처에 의해 결정됩니다.

  • 32 비트 시스템 : 최대 정수는 약 231-1 (2147483647)입니다.

  • 64 비트 시스템 : 최대 정수는 약 2? 3-1 (9223372036854775807)입니다.

변환 된 값 이이 범위를 초과하면 오버플로가 발생할 수 있습니다.


php에서 hexdec ()의 동작

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
?>

정수 오버플로를 피하는 방법?

  1. 문자열 처리 또는 다수 함수 사용 <br> 오버플로가 될 수있는 16 진수의 경우 PHP의 BCMATH 확장 또는 GMP 확장을 사용하는 것이 좋습니다.

 <?php
$hex = 'FFFFFFFFFFFFFFFF';

$decimal = gmp_strval(gmp_init($hex, 16), 10);
echo $decimal . "\n";
?>

GMP_INIT는 임의 크기의 수를 정확하게 처리하여 오버플로 및 정밀도 손실을 피할 수 있습니다.

  1. 제한 입력 범위 <br> 프로그램이 특정 범위 내에서 16 진수를 처리 해야하는 경우, 입력 할 때 확인하고 범위를 초과하는 데이터를 거부 할 수 있습니다.

  2. 숫자 값의 사용을 이해하십시오 <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";
?>

참조 링크

  • PHP 공식 매뉴얼 : Hexdec

  • PHP GMP 확장 문서 : GMP_INIT

  • PHP BCMATH 확장 문서 : BCADD