PHP에서 Pack () 및 Unpack () 함수는 종종 바이너리 데이터를 처리하는 데 사용되며, 바이트의 정확한 제어가 필요한 경우 네트워크 통신, 파일 읽기 및 쓰기, 데이터 인코딩 등과 같은 시나리오에서 사용하기에 특히 적합합니다. 이 기사는이 두 기능의 사용법을 자세히 설명하고 이진 데이터를보다 효율적으로 처리 할 수 있도록 전체 형식 코드 비교 테이블을 첨부합니다.
pack () : 패키지 데이터를 바이너리 문자열로합니다.
UNPACK () : 바이너리 문자열을 PHP 배열로 포장하십시오.
둘 다 형식 코드를 사용하여 데이터의 구조를 정의하여 데이터가 인코딩/디코딩되는 방법을 결정합니다.
$data = pack("C*", 72, 101, 108, 108, 111); // 할 것이다 ASCII 코드를 문자열로 변환합니다 "Hello"
echo $data; // 산출: Hello
문법:
string pack(string $format, mixed $values...)
$data = "Hello";
$result = unpack("C*", $data);
print_r($result);
산출:
Array
(
[1] => 72
[2] => 101
[3] => 108
[4] => 108
[5] => 111
)
문법:
array unpack(string $format, string $data, int $offset = 0)
형식 코드 | 설명 | 바이트 길이 | 크고 작은 끝 |
---|---|---|---|
에이 | NUL은 문자열을 채 웁니다 (NUL을 제거하지 않음) | 길이를 지정하십시오 | 없음 |
에이 | 공백 채우기 줄 (테일 공백이 제거됩니다) | 길이를 지정하십시오 | 없음 |
시간 | 16 진수 문자열, 각 문자는 4 비트를 나타냅니다 | 두 자리 숫자 = 1 바이트 | 없음 |
시간 | 캡 중 16 진수, 각 문자는 4 비트를 나타냅니다 | 두 자리 숫자 = 1 바이트 | 없음 |
기음 | 서명 된 캐릭터 (8 비트) | 1 바이트 | 없음 |
기음 | 서명되지 않은 캐릭터 (8 비트) | 1 바이트 | 없음 |
에스 | 서명 된 짧은 정수 (16 비트) | 2 바이트 | 호스트 바이트 순서 |
에스 | 서명되지 않은 짧은 정수 (16 비트) | 2 바이트 | 호스트 바이트 순서 |
N | 서명되지 않은 짧은 정수 (16 비트), 네트워크 바이트 순서 | 2 바이트 | 빅 엔디언 |
다섯 | 서명되지 않은 짧은 정수 (16 비트), 리틀 엔디언 바이트 순서 | 2 바이트 | 작은 엔디언 |
나 | 서명 된 정수 (기계 관련) | 4 바이트 또는 8 바이트 | 호스트 바이트 순서 |
나 | 서명되지 않은 정수 (기계 관련) | 4 바이트 또는 8 바이트 | 호스트 바이트 순서 |
엘 | 서명 긴 정수 (32 비트) | 4 바이트 | 호스트 바이트 순서 |
엘 | 서명되지 않은 긴 (32 비트) | 4 바이트 | 호스트 바이트 순서 |
N | 서명되지 않은 긴 정수 (32 비트), 네트워크 바이트 순서 | 4 바이트 | 빅 엔디언 |
다섯 | 서명되지 않은 긴 정수 (32 비트), 리틀 엔디 어 바이트 순서 | 4 바이트 | 작은 엔디언 |
에프 | 단일-정밀 플로팅 포인트 번호 (32 비트) | 4 바이트 | 호스트 바이트 순서 |
디 | 이중 정밀 부동물 지점 번호 (64 비트) | 8 바이트 | 호스트 바이트 순서 |
엑스 | 바이트 작성 (1 바이트 스킵) | 1 바이트 | 없음 |
엑스 | 반복 1 바이트 | 1 바이트 | 없음 |
@ | 절대 위치 설정 (건너 뛰기/위치로 돌아 가기) | 변하기 쉬운 | 없음 |
$ip = "192.168.1.1";
$packed = pack("C4", ...explode('.', $ip));
echo bin2hex($packed); // 산출 c0a80101
$unpacked = unpack("C4", $packed);
echo implode('.', $unpacked); // 산출 192.168.1.1
$binary = file_get_contents("https://m66.net/example/file.bin");
$header = unpack("a4signature/Nsize", $binary);
print_r($header);
형식 코드는 예를 들어 수량으로 수정할 수 있습니다.
C4 : 서명되지 않은 4 개의 문자를 나타냅니다
A10 : 10자를 나타내는 공백이있는 패딩 문자열
@8 : 8 번째 바이트 위치로 점프하십시오
* 사용하면 가능한 한 많이 읽을 수 있습니다.
$data = unpack("C*", "Hello"); // 모든 바이트를 읽으십시오
PHP의 Pack () 및 Unpack () 은 강력한 이진 처리 도구입니다. 형식 코드와 사용에 익숙해지면 기본 데이터를보다 유연하게 처리하는 데 도움이 될 수 있습니다. 프로토콜을 구문 분석, 구조화 된 데이터 저장 또는 효율적인 네트워크 통신 프로토콜을 구축하든이 두 가지 기능은 매우 실용적인 도구입니다.
많은 형식 코드가 있지만 일반적으로 사용되는 유형 (예 : C , N , N , F , D )을 마스터하면 대부분의 요구를 충족시킬 수 있습니다. Debugging이 더 편리하기 때문에 Bin2Hex () 및 Hex2Bin ()을 함께 사용하는 것이 좋습니다.