현재 위치: > 최신 기사 목록> Unpack () 및 Pack () 결합하여 사용자 정의 데이터 구조 분석을 구현합니다.

Unpack () 및 Pack () 결합하여 사용자 정의 데이터 구조 분석을 구현합니다.

M66 2025-05-27

PHP에서 이진 데이터를 처리 할 때 Pack ()포장 () 기능은 두 가지 매우 실용적인 도구입니다. 데이터를 특정 형식의 이진 문자열로 변환하거나 이진 문자열을 구조화 된 데이터로 변환 할 수 있습니다. 이는 사용자 정의 데이터 구조의 직렬화 및 사막화를 구현하거나 기본 프로토콜 및 파일 형식과 상호 작용하는 데 매우 중요합니다.

이 기사는 팩 ()포장 () 함수를 결합하여 사용자 정의 데이터 구조의 구문 분석 및 변환을 구현하는 방법을 자세히 설명합니다.


1. pack () 및 포장되지 않은 () 함수에 대한 기본 소개

  • pack (format, args ...) : 매개 변수 형식 문자열에 따라 이진 문자열로 포장합니다.

  • 포장 풀기 (형식, 데이터) : 바이너리 문자열 데이터를 형식 문자열에 따라 연결 배열로 포장합니다.

형식 문자열은 데이터 유형, 길이 및 엔지니어를 정의하는 형식 코드로 구성됩니다. 예를 들어:

  • C : 서명되지 않은 문자 (1 바이트)

  • N : 서명되지 않은 16 비트 빅 엔디안 엔드 엔디안 정수

  • V : 서명되지 않은 32 비트 리틀 엔디안 엔드 엔디안 정수

  • A : NUL 채우기 문자열

  • A : 공간에 채워진 문자열

더 많은 형식 코드는 공식 PHP 문서 를 참조하십시오.


2. 사용자 정의 데이터 구조 예제를 정의하십시오

간단한 데이터 구조를 다음과 같이 정의한다고 가정합니다.

필드 이름 유형 길이 (바이트) 설명
유형 UINT8 1 데이터 유형 식별
길이 UINT16 2 후속 데이터 길이
유효 탑재량 바이트 스트림 길이 특정 데이터 컨텐츠

우리의 목표는 다음과 같습니다.

  • PHP 데이터 구조를 위의 형식을 충족하는 이진 데이터로 포장합니다.

  • 이진 데이터는 구문 분석되고 유형, 길이 및 페이로드 필드가 추출됩니다.


3. Pack ()를 사용하여 데이터를 패키지하십시오

 <?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', $ 유형, $ 길이)는 먼저 유형길이를 별도로 포장 한 다음 원래 문자열 $ 페이로드를 연결합니다.


4. 데이터를 구문 분석하려면 unpack ()를 사용하십시오

구문 분석하는 동안 먼저 고정 길이 부분의 유형길이를 꺼낸 다음 길이 에 따라 나머지 페이로드를 가로 채립니다.

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

5. 완전한 예와 설명

위의 두 가지 기능을 통합하여 사용자 정의 구조의 직렬화 및 사막화를 구현합니다.

 <?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 데모
)

6. 요약

  • Pack ()Unpack ()은 이진 데이터를 처리하고 여러 데이터 유형 및 엔디 언 변환을 지원하는 강력한 도구입니다.

  • 사용자 정의 데이터 구조를 구문 분석하려면 먼저 고정 헤더 형식을 정의한 다음 문자열 작업을 사용하여 가변 길이 필드를 처리 할 수 ​​있습니다.

  • 이진 처리와 결합하여 PHP는 네트워크 프로토콜, 파일 형식 구문 분석 및 기타 시나리오를 쉽게 처리 할 수 ​​있습니다.