PHP에서 이진 데이터를 처리 할 때 Pack () 및 포장 () 기능은 두 가지 매우 실용적인 도구입니다. 데이터를 특정 형식의 이진 문자열로 변환하거나 이진 문자열을 구조화 된 데이터로 변환 할 수 있습니다. 이는 사용자 정의 데이터 구조의 직렬화 및 사막화를 구현하거나 기본 프로토콜 및 파일 형식과 상호 작용하는 데 매우 중요합니다.
이 기사는 팩 () 및 포장 () 함수를 결합하여 사용자 정의 데이터 구조의 구문 분석 및 변환을 구현하는 방법을 자세히 설명합니다.
pack (format, args ...) : 매개 변수 를 형식 문자열에 따라 이진 문자열로 포장합니다.
포장 풀기 (형식, 데이터) : 바이너리 문자열 데이터를 형식 문자열에 따라 연결 배열로 포장합니다.
형식 문자열은 데이터 유형, 길이 및 엔지니어를 정의하는 형식 코드로 구성됩니다. 예를 들어:
C : 서명되지 않은 문자 (1 바이트)
N : 서명되지 않은 16 비트 빅 엔디안 엔드 엔디안 정수
V : 서명되지 않은 32 비트 리틀 엔디안 엔드 엔디안 정수
A : NUL 채우기 문자열
A : 공간에 채워진 문자열
더 많은 형식 코드는 공식 PHP 문서 를 참조하십시오.
간단한 데이터 구조를 다음과 같이 정의한다고 가정합니다.
필드 이름 | 유형 | 길이 (바이트) | 설명 |
---|---|---|---|
유형 | UINT8 | 1 | 데이터 유형 식별 |
길이 | UINT16 | 2 | 후속 데이터 길이 |
유효 탑재량 | 바이트 스트림 | 길이 | 특정 데이터 컨텐츠 |
우리의 목표는 다음과 같습니다.
PHP 데이터 구조를 위의 형식을 충족하는 이진 데이터로 포장합니다.
이진 데이터는 구문 분석되고 유형, 길이 및 페이로드 필드가 추출됩니다.
<?php
function packData(int $type, string $payload): string {
$length = strlen($payload);
// 'C' - 1바이트 부호없는 정수
// 'n' - 2바이트는 서명되지 않은 큰 엔디안 정수
// 'a*' - 길이의 끈,NUL충전재(这里不需要충전재)
return pack('Cn', $type, $length) . $payload;
}
// 시험
$type = 5;
$payload = "Hello, World!";
$binaryData = packData($type, $payload);
echo bin2hex($binaryData);
?>
여기에서 팩 ( 'CN', $ 유형, $ 길이)는 먼저 유형 과 길이를 별도로 포장 한 다음 원래 문자열 $ 페이로드를 연결합니다.
구문 분석하는 동안 먼저 고정 길이 부분의 유형 과 길이를 꺼낸 다음 길이 에 따라 나머지 페이로드를 가로 채립니다.
<?php
function unpackData(string $binaryData): array {
// 첫 번째 릴리스 전에3바이트,type(1바이트) + length(2바이트大端)
$header = unpack('Ctype/nlength', substr($binaryData, 0, 3));
$type = $header['type'];
$length = $header['length'];
// 나머지를 꺼내십시오payload데이터
$payload = substr($binaryData, 3, $length);
return [
'type' => $type,
'length' => $length,
'payload' => $payload,
];
}
// 시험
$data = $binaryData; // 위에서 가정합니다packData산출
$result = unpackData($data);
var_dump($result);
?>
위의 두 가지 기능을 통합하여 사용자 정의 구조의 직렬화 및 사막화를 구현합니다.
<?php
function packData(int $type, string $payload): string {
$length = strlen($payload);
return pack('Cn', $type, $length) . $payload;
}
function unpackData(string $binaryData): array {
$header = unpack('Ctype/nlength', substr($binaryData, 0, 3));
$type = $header['type'];
$length = $header['length'];
$payload = substr($binaryData, 3, $length);
return [
'type' => $type,
'length' => $length,
'payload' => $payload,
];
}
// 사용의 예
$type = 10;
$payload = "PHP pack/unpack 데모";
$packed = packData($type, $payload);
echo "二进制데이터(hex):" . bin2hex($packed) . "\n";
$unpacked = unpackData($packed);
echo "분석 결과:\n";
print_r($unpacked);
?>
실행 결과 :
二进制데이터(hex):0a0017... (hex인코딩 된 이진 함량)
분석 결과:
Array
(
[type] => 10
[length] => 23
[payload] => PHP pack/unpack 데모
)
Pack () 및 Unpack ()은 이진 데이터를 처리하고 여러 데이터 유형 및 엔디 언 변환을 지원하는 강력한 도구입니다.
사용자 정의 데이터 구조를 구문 분석하려면 먼저 고정 헤더 형식을 정의한 다음 문자열 작업을 사용하여 가변 길이 필드를 처리 할 수 있습니다.
이진 처리와 결합하여 PHP는 네트워크 프로토콜, 파일 형식 구문 분석 및 기타 시나리오를 쉽게 처리 할 수 있습니다.