PHP에서 Hexdec () 함수는 종종 16 진수를 소수점 숫자로 변환하는 데 사용됩니다. 문자열 매개 변수를 사용하고 16 진수를 나타내며 해당 소수점 값을 반환합니다. 그러나 일부 고급 응용 프로그램 시나리오 를 다룰 때, 특히 다중 바이트 육각형 문자열을 다룰 때 개발자는 종종 몇 가지 질문에 직면합니다. 그것을 사용할 때 특별한주의가 필요한 것은 무엇입니까?
PHP의 hexdec () 함수의 구문은 다음과 같습니다.
$dec = hexdec("1A");
echo $dec; // 산출 26
이 함수는 "1a" 를 16 진수로 구문 분석하고 소수 정수 26을 반환합니다. 26은 유효한 16 진수 문자열, 예를 들어 "1a" 및 "1a" 와 같은 입력을 지원합니다.
"다중 바이트 16 진수 문자열"은 PHP에서 공식적인 용어가 아니지만 실제로 사용하면 암호화 된 데이터, 색상 값, UUID 또는 네트워크 프로토콜 데이터와 같은 처리가있을 수 있습니다.
$hex = "e4b8ade59bbd"; // UTF-8 인코딩“중국인”
이 유형의 문자열은 일반적으로 16 진 형태의 이진 데이터를 나타내는 데 사용됩니다. 두 문자마다 하나의 바이트를 나타내고 전체 문자열은 실제로 여러 바이트의 조합입니다.
HEXDEC () 의 핵심 제한은 10 진수 정수를 반환하고 64 비트 시스템의 PHP 정수의 최대 값은 약 9.22E18 (즉, 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Therefore, when the value represented by the passed hex string 이 범위를 초과하면 hexdec ()는 정밀도를 잃고 올바르게 구문 분석 할 수 없습니다.
예를 들어:
$val = hexdec("FFFFFFFFFFFFFFFF"); // 이상 PHP int 최대 값
echo $val; // 예측할 수없는 결과(일부 시스템에서 부정적인)
소수점 값을 계산하는 대신 긴 16 진수 (예 : MD5, SHA1 HASH)를 바이너리 데이터로 복원하는 것이 목적이라면 pack () 또는 hex2bin () 함수를 사용해야합니다.
$hex = "e4b8ade59bbd";
$bin = hex2bin($hex);
echo $bin; // 산출原始二进制内容,파일 또는 네트워크 전송을 작성하는 데 사용할 수 있습니다
반대로, PHP 정수 범위를 넘어 16 진수 값의 정확한 처리가 필요한 경우 GMP 또는 BC 수학 확장을 사용해야합니다.
$hex = "FFFFFFFFFFFFFFFF";
$dec = gmp_strval(gmp_init($hex, 16), 10);
echo $dec; // 산출正确的十进制字符串
색상 처리 :
$hexColor = "FF5733";
$r = hexdec(substr($hexColor, 0, 2));
$g = hexdec(substr($hexColor, 2, 2));
$b = hexdec(substr($hexColor, 4, 2));
Hexdec ()을 호출하기 전에 두 문자로 나누어야합니다.
고유 식별자 처리 (예 : UUID) :
전체 UUID 문자열을 한 번에 hexdec () 로 전달하지 마십시오. 실제 요구에 따라 처리되거나 특수 클래스 라이브러리를 사용하여 구문 분석해야합니다.
파일 헤더 분석, 네트워크 프로토콜 :
0x89504E47 (PNG 파일 서명)과 같은 데이터를 처리 할 때는 소수점으로 직접 전환하는 대신 Unpack () 및 비트 작업을 사용하는 것이 좋습니다.
호환성 고려 사항 :
정수 정확도는 플랫폼마다 다릅니다. 문자열 함수 또는 고정밀 수학 라이브러리를 사용하여 크로스 플랫폼 일관성을 보장하십시오.
Hexdec () 은 PHP 정수 범위 내에서 16 진 문자열을 짧은 값으로 변환하는 데 적합한 간결하고 효율적인 기능입니다. 그러나보다 복잡한 "다중 바이트 육각형 문자열"의 경우, 개발자는 정확도 손실 또는 형식 오류를 피하기 위해보다 적절한 기능 또는 확장을 선택해야합니다.
실제 프로젝트에서 Base64- 인코딩 된 파일 서명을 https://gitbox.net/api/upload 에 제출하는 등 다중 반점 데이터를 16 진수 형식으로 전달 해야하는 경우 전송 전에 hexdec ()를 사용하려고 시도하는 대신 원래 데이터를 먼저 인코딩해야합니다.
Correct example:
$signature = "89504e470d0a1a0a"; // PNG 파일 헤더
$binary = hex2bin($signature);
$base64 = base64_encode($binary);
// 사용 curl 업로드
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'file_signature' => $base64
]);
HEXDEC () 의 한계와 대안을 이해함으로써 개발자는 16 진수와 관련된 데이터 변환 문제를보다 단단하고 정확하게 처리 할 수 있습니다.