Bei der Verarbeitung von Binärdaten bietet PHP eine sehr leistungsstarke Funktion - pack () . Es kann Daten gemäß dem angegebenen Format in binäre Zeichenfolgen verpacken, das sehr nützlich ist, um Metadaten -Header -Informationen für Mediendateien wie Bilder, Audio usw. zu erstellen.
Die grundlegende Syntax der Funktion pack () lautet wie folgt:
string pack(string $format, mixed ...$values)
$ format ist eine Formatzeichenfolge, die angibt, wie jeder Wert in binär konvertiert werden soll.
$ values ist ein oder mehrere Werte, die konvertiert werden müssen.
Gemeinsame Formatzeichen umfassen:
C : Unsignierte Zeichen (8 Bit)
N : Nicht signierte kurze Ganzzahl (16-Bit, Big-Endian)
V : nicht signierte kurze Ganzzahl (16-Bit, Kleinanleiter)
N : Unsigned Long Ganzzahl (32-Bit, Big Endian)
V : Unsigned Long (32-Bit, Kleinanleiter)
A : NUL füllt die Zeichenfolge
A : Space Filling String
Der Dateikopf einer WAV-Datei folgt dem Riff-Format und besteht im Allgemeinen aus einem 44-Byte-Header. Hier ist ein Beispiel für eine minimale WAV -Datei -Header -Konstruktion:
<?php
$sampleRate = 44100;
$bitsPerSample = 16;
$channels = 2;
$dataSize = 100000; // Audiodatengröße,Annehmen 100000 Byte
$byteRate = $sampleRate * $channels * $bitsPerSample / 8;
$blockAlign = $channels * $bitsPerSample / 8;
// Struktur WAV Datei -Header
$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
);
// Ausgabe als tatsächliche Datei
file_put_contents('output.wav', $header);
?>
Das Skript erstellt einen Ausgangs -WAV -Dateiheader, den Sie dann die tatsächlichen Audiodaten anschließen können, um eine spielbare WAV -Datei zu generieren.
BMP -Dateien verwenden auch feste Format -Headers, die mit Pack () konstruiert werden können.
<?php
$width = 100;
$height = 100;
$bitsPerPixel = 24;
$rowSize = (int)(($bitsPerPixel * $width + 31) / 32) * 4;
$imageSize = $rowSize * $height;
$fileSize = 54 + $imageSize; // 54 Byte的头部 + Bilddaten
$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
);
// Header ausgeben zur Datei ausgeben
file_put_contents('output.bmp', $header);
?>
Anschließend können Sie jede Zeile von Pixeldaten ausfüllen (beachten Sie, dass jede BMP -Zeile 4 Bytes ausgerichtet sein muss), um die Bilddatei zu vervollständigen.
Byte Order Problem : Multi-Byte-Nummern sollten die Plattform-Endreihenfolge in Betracht ziehen und V oder N zur Kontrolle (Little Endian oder Big Endian) verwenden.
Ausrichtungsanforderungen : BMP, WAV und andere Formate haben strenge Anforderungen an die Feldausrichtung und die strukturelle Ordnung. Bei der Verwendung von pack () müssen Sie sicherstellen, dass die Felder genau entsprechen.
Debug -Ausgabe : Sie können Bin2hex () oder pack () verwenden, um festzustellen, ob die verpackten Ergebnisse den Erwartungen entsprechen.
Konstrukte komplexe Datei -Header : Kann manuell analysiert und in Pack () -Anrufe in Kombination mit offiziellen Formatspezifikationen konvertiert werden. Um beispielsweise einen IHDR -Block eines ID3V2 -Audiokopfes oder PNG zu generieren, konsultieren Sie unbedingt die entsprechenden Dokumente.