현재 위치: > 최신 기사 목록> Pack ()를 사용하여 사진/오디오 메타 데이터 헤더 정보를 만듭니다

Pack ()를 사용하여 사진/오디오 메타 데이터 헤더 정보를 만듭니다

M66 2025-05-29

이진 데이터를 처리 할 때 PHP는 매우 강력한 기능 -Pack ()를 제공합니다. 지정된 형식에 따라 이진 문자열에 데이터를 패키지 할 수 있습니다. 예를 들어 WAV 오디오 파일의 헤더 정보를 구성하거나 BMP 이미지에 대한 파일 헤더를 생성하려면 Pack () 가 유능합니다.

pack () 란 무엇입니까?

pack () 함수의 기본 구문은 다음과 같습니다.

 string pack(string $format, mixed ...$values)
  • $ 형식은 각 값을 바이너리로 변환하는 방법을 지정하는 형식 문자열입니다.

  • $ 값은 하나 이상의 값을 변환 할 값입니다.

일반적인 형식 문자는 다음과 같습니다.

  • C : 서명되지 않은 문자 (8 비트)

  • N : 서명되지 않은 짧은 정수 (16 비트, 대기업)

  • V : 서명되지 않은 짧은 정수 (16 비트, 스몰 엔디언)

  • N : 서명되지 않은 긴 정수 (32 비트, Big Endian)

  • V : 서명되지 않은 긴 (32 비트, 스몰 렌디안)

  • A : NUL은 문자열을 채 웁니다

  • A : 공간은 문자열을 채 웁니다

예 1 : WAV 오디오 파일의 헤더 정보 작성

WAV 파일의 파일 헤더는 리프 형식을 따르며 일반적으로 44 바이트 헤더로 구성됩니다. 다음은 최소 WAV 파일 헤더 구성의 예입니다.

 <?php
$sampleRate = 44100;
$bitsPerSample = 16;
$channels = 2;
$dataSize = 100000; // 오디오 데이터 크기,추정하다 100000 바이트
$byteRate = $sampleRate * $channels * $bitsPerSample / 8;
$blockAlign = $channels * $bitsPerSample / 8;

// 구조 WAV 파일 헤더
$header = pack(
    'A4VVA4A4VVvvVVvvA4V',
    'RIFF',                // ChunkID
    36 + $dataSize,        // ChunkSize
    0x45564157,            // Format 'WAVE'
    'fmt ',                // Subchunk1ID
    16,                    // Subchunk1Size (PCM)
    1,                     // AudioFormat (1 = PCM)
    $channels,             // NumChannels
    $sampleRate,           // SampleRate
    $byteRate,             // ByteRate
    $blockAlign,           // BlockAlign
    $bitsPerSample,        // BitsPerSample
    'data',                // Subchunk2ID
    $dataSize              // Subchunk2Size
);

// 실제 파일로 출력
file_put_contents('output.wav', $header);
?>

스크립트는 output.wav 파일 헤더를 생성 한 다음 실제 오디오 데이터를 첨부하여 재생 가능한 WAV 파일을 생성 할 수 있습니다.

예 2 : BMP 이미지의 파일 헤더 빌드

BMP 파일은 Pack () 를 사용하여 구성 할 수있는 고정 형식 헤더를 사용합니다.

 <?php
$width = 100;
$height = 100;
$bitsPerPixel = 24;
$rowSize = (int)(($bitsPerPixel * $width + 31) / 32) * 4;
$imageSize = $rowSize * $height;
$fileSize = 54 + $imageSize; // 54 바이트的头部 + 이미지 데이터

$header = pack(
    'A2VvvVVVVvvVVVV',
    'BM',             // Signature
    $fileSize,        // File size
    0,                // Reserved1
    0,                // Reserved2
    54,               // Offset to image data
    40,               // Info header size
    $width,           // Width
    $height,          // Height
    1,                // Planes
    $bitsPerPixel,    // Bits per pixel
    0,                // Compression (none)
    $imageSize,       // Image size
    2835,             // X pixels per meter (72 DPI)
    2835,             // Y pixels per meter (72 DPI)
    0,                // Colors used
    0                 // Important colors
);

// 출력 헤더로 파일
file_put_contents('output.bmp', $header);
?>

그런 다음 이미지 파일을 완성하려면 각 행의 픽셀 데이터 (각 BMP의 각 행이 4 바이트 정렬되어야 함)를 채울 수 있습니다.

주목해야 할 것

  1. 바이트 주문 문제 : 다중 바이트 숫자는 플랫폼 엔드 순서를 고려하고 V 또는 N을 사용하여 제어해야합니다 (Little Endian 또는 Big Endian).

  2. 정렬 요구 사항 : BMP, WAV 및 기타 형식은 현장 정렬 및 구조 순서에 대한 엄격한 요구 사항이 있습니다. pack ()을 사용하는 경우 필드가 정확한지 확인해야합니다.

  3. 디버그 출력 : Bin2Hex () 또는 포장을 풀어 포장 된 결과가 기대치를 충족하는지 확인할 수 있습니다.

  4. 복잡한 파일 헤더 구성 : 공식 형식 사양과 함께 수동으로 구문 분석하고 pack () 호출로 변환 할 수 있습니다. 예를 들어, ID3V2 오디오 헤드 또는 PNG의 IHDR 블록을 생성하려면 관련 문서를 참조하십시오.

결론