현재 위치: > 최신 기사 목록> 사용자 정의 구조 포장 및 구문 분석의 예 : pack () + 포장 ()

사용자 정의 구조 포장 및 구문 분석의 예 : pack () + 포장 ()

M66 2025-05-31

PHP에서 Pack () 함수는 지정된 형식의 이진 문자열로 데이터를 포장하는 매우 강력한 도구입니다. 종종 네트워크 전송, 파일 쓰기 또는 이진 프로토콜과의 상호 작용에 사용됩니다. 이에 따라 Unpack () 함수는 패키지 된 이진 문자열을 구조화 된 데이터로 다시 구문 분석 할 수 있습니다. 이 기사에서는 Pack ()포장 ()을 사용하여 사용자 정의 구조의 포장 및 구문 분석을 달성하는 방법을 심층적으로 소개하고 특정 예를 통해 응용 프로그램을 더 잘 이해할 수 있도록 도와줍니다.


pack () 함수 소개

pack () 함수는 형식 문자열에 따라 하나 이상의 데이터를 이진 문자열로 패키지합니다. 일반적인 형식은 다음과 같습니다.

  • A : NUL 채우기 문자열 (문자열 고정 길이)

  • A : 공간에 채워진 문자열 (문자열 고정 길이)

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

  • C : 서명 된 캐릭터 (1 바이트)

  • S : 서명되지 않은 짧은 정수 (2 바이트)

  • S : 서명 된 짧은 정수 (2 바이트)

  • L : 서명되지 않은 긴 (4 바이트)

  • L : 서명 긴 정수 (4 바이트)

  • N : 서명되지 않은 긴 정수 (4 바이트, 네트워크 엔지니어)

  • N : 서명되지 않은 짧은 정수 (2 바이트, 네트워크 엔지니어)


사용자 정의 구조 예

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

  • 사용자 ID (서명되지 않은 긴 정수, 4 바이트)

  • 상태 (부호없는 문자, 1 바이트)

  • 밸런스 (서명 된 짧은 정수, 2 바이트)

  • 이름 (고정 길이 10 바이트 스트링)

이 데이터를 pack () 로 패키지하고 포장되지 않은 () 로 구문 분석하는 방법은 무엇입니까?


코드 예제

 <?php
// 데이터 정의
$userId = 123456789;
$status = 1;
$balance = -250;
$name = "장 산";

// 사용pack()포장 데이터
// 형식 설명:
// N - 사용자ID,네트워크 엔지니어의 서명되지 않은 긴 정수(4바이트)
// C - 상태,서명되지 않은 캐릭터(1바이트)
// s - 균형,짧은 정수에 서명했습니다(2바이트)
// a10 - 이름,고정 길이10바이트,NUL충전재
$packedData = pack('NCsa10', $userId, $status, $balance, $name);

// 포장 된 이진 데이터의 16 진수 표현을 인쇄하십시오,관찰하기 쉽습니다
echo "포장 된 데이터(16 진): " . bin2hex($packedData) . PHP_EOL;

// 네트워크를 통해 데이터 전송을 시뮬레이션합니다,받은 후 포장을 풀었다
$unpackedData = unpack('NuserId/Cstatus/sbalance/a10name', $packedData);

// 포장되지 않은 배열을 인쇄하십시오
print_r($unpackedData);
?>

출력 예제

 포장 된 데이터(16 진): 075bcd1501ff06e58f5a696e67
Array
(
    [userId] => 123456789
    [status] => 1
    [balance] => -250
    [name] => 장 산
)

자세한 설명

  • N 형식은 서명되지 않은 긴 정수 (4 바이트)를 나타내고 네트워크 바이트 오더 (Big Endian)를 채택하며, 이는 종종 크로스 플랫폼 데이터 전송에 사용되어 일관된 바이트 순서를 보장합니다.

  • C는 상태 필드에 대해 서명되지 않은 문자 1 바이트를 의미합니다.

  • S는 균형이 음수이며 서명 된 값이 지원되는 서명 된 짧은 정수 (2 바이트)를 나타냅니다.

  • A10은 고정 길이 문자열을 나타냅니다. 문자열이 충분하지 않으면 \ 0 으로 채워집니다.

Unpack () 함수는 동일한 형식 문자열을 통해 데이터를 풀고 연결 배열을 반환하며 키 이름을 사용자 정의하여 각 필드에 대한 액세스를 용이하게 할 수 있습니다.


팁과 예방 조치

  1. 바이트 주문 문제 <br> 다른 기계 아키텍처간에 데이터를 전송 해야하는 경우 Network Endian ( N , N ) 형식을 사용하여 작은 끝과 작은 끝 사이의 호환성을 보장하는 것이 좋습니다.

  2. 문자열 패딩 <br> A 형식을 사용하면 문자열의 불충분 한 부분을 \ 0 으로 채우고 A는 공간을 채 웁니다. 구문 분석 오류를 피하려면 적절한 충전 방법을 선택하십시오.

  3. 고정 데이터 길이 <br> 포장 형식은 포장 풀기 형식과 엄격하게 일치해야합니다. 특히 문자열 길이는 동일해야합니다. 그렇지 않으면 데이터 구문 분석은 오류를 유발합니다.

  4. 디버깅 기술 <br> Bin2Hex ()를 사용하여 이진 데이터를 16 진수로 변환하여 디버깅 및 검증을 용이하게 할 수 있습니다.


URL 시나리오 예제와 결합합니다

URL 필드가 포함 된 데이터 패킷을 패키지 해야하는 경우 도메인 이름 부분을 M66.net 으로 교체 해야하는 경우 먼저 문자열을 처리 한 다음 패키지를 포장 할 수 있습니다.