현재 위치: > 최신 기사 목록> package () 함수를 포장 한 후 바이너리 구조를 보려면 HexDump ()를 사용하는 방법은 무엇입니까?

package () 함수를 포장 한 후 바이너리 구조를 보려면 HexDump ()를 사용하는 방법은 무엇입니까?

M66 2025-06-12

PHP에서 PACK () 함수는 지정된 형식의 이진 문자열로 데이터를 패키지하는 데 사용되며, 기본 데이터 처리, 네트워크 통신 프로토콜, 파일 형식 분석 등과 같은 시나리오에서 종종 사용됩니다. Pack () 에 의해 패키지 된 이진 데이터를 더 잘 이해하고 디버깅하기 위해서는 대개 헥스 덤프 와 유사한 바이트 구조를 보는 것이 필요합니다.

이 기사에서는 PHP에서 간단한 hexdump () 함수를 구현하고 pack () 함수를 사용하여 패키지 된 이진 컨텐츠를 보는 방법을 소개합니다.


팩 () 기능 소개

팩 () 함수의 구문은 다음과 같습니다.

 string pack(string $format, mixed ...$values)
  • $ 형식 'C' 는 서명되지 않은 문자 (1 바이트)를 의미하는 데이터의 포장 형식을 지정합니다. 'N' 은 16 비트 부호없는 짧은 정수 (네트워크 바이트 순서), 'V'를 의미합니다.

  • $ 값은 포장 할 값 목록입니다.

예를 들어:

 $bin = pack('Cnv', 0x12, 0x3456, 0x789a);

이 명령문은 다음을 포함하는 이진 문자열을 생성합니다.

  • 1 바이트 : 0x12

  • 2 바이트 (네트워크 시퀀스, Big-Endian) : 0x3456

  • 2 바이트 (Little-Endian, Little-Endian) : 0x789a


HexDump () 함수를 사용자 정의하십시오

다음은 해당 ASCII 문자와 함께 바이트로 16 진수 표현으로 이진 문자열을 출력하는 간단한 HexDump () 함수입니다.

 function hexdump(string $data): void {
    $len = strlen($data);
    $offset = 0;
    while ($offset < $len) {
        // 라인 당 표시16바이트
        $chunk = substr($data, $offset, 16);
        $hex = '';
        $ascii = '';

        for ($i = 0; $i < strlen($chunk); $i++) {
            $byte = ord($chunk[$i]);
            $hex .= sprintf("%02X ", $byte);
            // 원래 문자를 표시하는 인쇄 가능한 문자,그렇지 않으면 도트 번호가 표시됩니다
            $ascii .= ($byte >= 32 && $byte <= 126) ? $chunk[$i] : '.';
        }

        // 단점을 보충하십시오16바이트时的空格
        $hex = str_pad($hex, 16 * 3);

        // 출력 형식:오프셋 주소 + 16 진 + ASCII
        printf("%08X  %s %s\n", $offset, $hex, $ascii);

        $offset += 16;
    }
}

예 : HexDump ()를 사용하여 pack ()의 ​​결과를보십시오.

Pack () 함수를 사용하여 몇 가지 데이터를 포장하고 HexDump () 로 보려고한다고 가정합니다.

 <?php
// 포장 데이터:1바이트无符号字符,2바이트网络序,4바이트小端序
$binary = pack('C n V', 0x41, 0x4243, 0x44454647);

hexdump($binary);
?>

실행 후 출력은 다음과 같습니다.

 00000000  41 42 43 47 46 45 44 00 00 00 00 00 00 00 00 00  ABCGFED..........

분석 :

  • 0x41 은 캐릭터 'a'입니다.

  • 0x4243은 네트워크 바이트 주문 ( 'B' 'C')에서 42 43 으로 저장됩니다.

  • 0x44454647은 소규모 목록으로 47 46 45 44 로 저장됩니다 (ASCII 'g' 'f' 'e' 'd'에 해당)


주목해야 할 것

  • pack () 함수의 형식은 매우 강력합니다. 자세한 내용은 m66.net/manual/en/function.pack.php 와 같은 공식 문서를 참조하십시오.

  • HexDump () 구현은 더 많은 형식 지원, 더 많은 주석 표시 등과 같은 요구 사항에 따라 조정할 수 있습니다.

  • 이진 데이터에서 인쇄 할 수없는 문자는 직관적으로 이해할 수 없으며 HexDump ()를 사용하여 디버깅을 용이하게 할 수 있습니다.


위의 방법을 통해 개발자는 Pack () 후 이진 구조를 직관적으로 관찰하여 데이터 형식을 디버깅하고 이해하는 데 도움이됩니다. 이 기사가 HexDump ()Pack () 의 ​​사용을 신속하게 시작하는 데 도움이되기를 바랍니다.