현재 위치: > 최신 기사 목록> pack () 및 unpack ()을 사용하여 양방향 변환기를 구현합니다

pack () 및 unpack ()을 사용하여 양방향 변환기를 구현합니다

M66 2025-05-28

PHP에서 Pack ()Unpack ()은 이진 데이터와 사람이 읽을 수있는 형식 사이를 변환하는 데 종종 사용되는 강력한 기능 쌍입니다. 이 기사에서는이 두 가지 기능을 사용하여 간단한 양방향 데이터 변환기를 생성하여 파일 스토리지, 네트워크 전송 및 기타 시나리오에 적합한 데이터 구조의 직렬화 및 사막화를 실현하는 방법을 사용합니다.

기본 개념

  • pack () : 지정된 형식에 따라 하나 이상의 값을 이진 문자열로 포장합니다.

  • UNPACK () : 이진 문자열에서 지정된 형식으로 값을 구문 분석합니다.

이 두 기능의 형식 코드는 정수, 부동 소수점 유형, 문자열 등과 같은 여러 데이터 유형을 지원합니다. 공통 형식 문자는 다음과 같습니다.

형식 문자 의미 바이트 점유
기음 서명되지 않은 숯 1 바이트
N 서명되지 않은 짧은 정수 (Big Endian) 2 바이트
N 서명되지 않은 긴 (Big Endian) 4 바이트
에이 NUL 채우기 문자열 n 바이트

시나리오 설정 : 간단한 데이터 구조

다음 구조의 데이터를 패키지하고 포장해야한다고 가정합니다.

  • 사용자 ID (4 바이트 부호없는 정수)

  • 사용자 수준 (1 바이트)

  • 활성화 여부 (부울 값, 0 및 1으로 표시)

  • 사용자 이름 (고정 길이 문자열, 20 바이트)

우리가 달성하고자하는 것은 다음과 같습니다.

  1. Pack ()을 사용 하여이 필드를 이진 문자열로 패키지하십시오.

  2. Unpack ()을 사용 하여이 문자열에서 원래 데이터를 다시 부르십시오.

변환기 클래스를 작성하십시오

 class DataConverter {
    const FORMAT = 'Nid/Clevel/Cactive/a20username';

    public static function encode($data) {
        return pack(
            self::FORMAT,
            $data['id'],
            $data['level'],
            $data['active'] ? 1 : 0,
            $data['username']
        );
    }

    public static function decode($binary) {
        $result = unpack(self::FORMAT, $binary);
        $result['active'] = $result['active'] === 1;
        $result['username'] = rtrim($result['username'], "\0"); // 제거하다 NUL 충전재
        return $result;
    }
}

사용의 예

 $data = [
    'id' => 123456,
    'level' => 5,
    'active' => true,
    'username' => 'm66user'
];

$binary = DataConverter::encode($data);
echo bin2hex($binary) . PHP_EOL;

$parsed = DataConverter::decode($binary);
print_r($parsed);

출력 예제 (16 진수 표현) :

 0001e24005016d363675736572000000000000000000000000
Array
(
    [id] => 123456
    [level] => 5
    [active] => 1
    [username] => m66user
)

응용 프로그램 시나리오 확장

이 변환기는 간단하지만보다 복잡한 사용 시나리오로 확장 할 수 있습니다.

  • 소켓 통신 데이터 구성 및 구문 분석과 같은 네트워크 프로토콜 패킷.

  • 이진 파일의 직렬화 및 사막화.

  • 컴팩트 한 데이터 저장 (캐시, 임베디드 장치 등)시 사용.

예를 들어 인코딩 된 데이터를 원격 인터페이스로 보낼 수 있습니다.

 file_put_contents("https://m66.net/api/upload", $binary);

또는 원격 디코딩에서 데이터로드 :