php에서 pack () 함수는 지정된 형식의 이진 문자열로 데이터를 패키지하는 데 사용됩니다. 많은 개발자가 네트워크 프로토콜 또는 이진 파일을 처리 할 때 사용합니다. Pack ( "N", 12345) 은 일반적인 사용법이며, 이는 정수 12345가 대형 엔드 바이트 순서 (네트워크 바이트 순서)의 4 바이트 바이너리 스트링에 포장되어 있음을 의미합니다.
그러나 때로는 Pack ( "N", 12345)을 사용한 후 얻은 결과가 예상 한 출력과 일치하지 않으며 16 진수 또는 출력으로 변환 될 때 "이상한"것처럼 보일 수도 있습니다. 이게 왜? 이 기사는 그 뒤에있는 원칙을 분석하는 데 도움이됩니다.
형식 문자 "n" 은 pack () 에 표시됩니다.
N : 서명되지 않은 긴 (4 바이트, 32 비트 서명되지 않은 정수)
Big-Endian, 즉 높은 바이트가 앞쪽에 있고 낮은 바이트가 뒤쪽에 있습니다.
예를 들어, 정수 12345 의 16 진수 표현은 0x3039 이고 해당 4 바이트 빅 엔디안은 다음과 같습니다.
00 00 30 39
따라서 팩 ( "N", 12345) 에 의해 생성 된 이진 스트링은이 4 바이트로 16 진수로 변환되어야합니다.
많은 사람들은 결과가 "잘못 보인다"는 결과를 관찰하고 일반적인 이유는 다음과 같습니다.
보이지 않는 문자가 많이 포함 된 브라우저 나 터미널에 바이너리 문자열을 직접 출력하거나 일부 바이트가 aarrbled 코드처럼 보이는 제어 문자로 구문 분석됩니다.
이진 결과는 16 진수 또는 Base64와 같은 읽기 가능한 형식으로 변환되지 않습니다 .
결과의 기대는 실제 의미와 일치하지 않습니다 . 예를 들어, Pack ( "N", 12345) 이 숫자 문자열 "12345"를 직접 출력한다고 생각합니다.
다음 PHP 코드를 작성한다고 가정합니다.
<?php
$binary = pack("N", 12345);
echo bin2hex($binary);
?>
작업의 결과는 다음과 같습니다.
00003039
이것은 예상 4 바이트 빅 엔디안 결과입니다.
echo $ binary를 사용하는 경우; $ Binary는 일반 텍스트가 아닌 이진 데이터이므로 직접 garbled 코드 또는 공백이 표시됩니다.
오류 데모 :
<?php
echo pack("N", 12345);
?>
웹 페이지 나 터미널에 출력하면 차량이 있거나 보이는 문자가 표시되지 않습니다. 이것은 팩 () 의 결과가 잘못되었다고 실수로 생각하게 만듭니다.
Pack ( "N", 12345)는 숫자 12345를 나타내는 Big-Endian 바이트 순서로 4 바이트 바이너리 스트링을 반환합니다.
결과는 문자열 "12345"가 아닌 이진 데이터입니다.
결과를 볼 때는 bin2Hex () 또는 유사한 방법을 사용하여 읽을 수있는 형식으로 변환하는 것이 가장 좋습니다.
이진의 직접 출력은 겉보기에는 "이상한"결과를 가져올 수 있지만 오류는 아닙니다.
<?php
// 번호를 넣으십시오12345포장4바이트 빅 엔디안 바이너리
$binary = pack("N", 12345);
// 이진의 16 진수 표현을 보여줍니다,편리한 관찰
echo "Hex representation: " . bin2hex($binary) . "\n";
// 또한 사용할 수 있습니다 unpack 항-응축
$unpacked = unpack("N", $binary);
echo "Unpacked number: " . $unpacked[1] . "\n";
?>
실행 후 출력 :
Hex representation: 00003039
Unpacked number: 12345
팩 에 대한 PHP 공식 문서
이진 데이터 처리에 대한 Endian의 중요성을 이해하십시오
네트워크 프로토콜과 이진 데이터의 관계