Lors du traitement des données binaires, PHP fournit une fonction très puissante - pack () . Il peut emballer des données dans des chaînes binaires en fonction du format spécifié, qui est très utile pour créer des informations d'en-tête de métadonnées pour les fichiers multimédias tels que des images, audio, etc. Par exemple, si vous souhaitez construire les informations d'en-tête d'un fichier audio WAV, ou générer un en-tête de fichier pour une image BMP, Pack () est compétent.
La syntaxe de base de la fonction Pack () est la suivante:
string pack(string $format, mixed ...$values)
$ format est une chaîne de format qui spécifie comment chaque valeur doit être convertie en binaire.
$ Les valeurs sont une ou plusieurs valeurs à convertir.
Les caractères de format commun comprennent:
C : caractères non signés (8 bits)
N : entier court non signé (16 bits, Big-endian)
V : entier court non signé (16 bits, petit-endian)
N : entier long non signé (32 bits, Big Endian)
V : Long non signé (32 bits, petit-endian)
A : Nul remplit la chaîne
A : l'espace remplit la ficelle
L'en-tête de fichier d'un fichier WAV suit le format de riff et est généralement composé d'un en-tête de 44 octets. Voici un exemple d'une construction en tête de fichier WAV minimale:
<?php
$sampleRate = 44100;
$bitsPerSample = 16;
$channels = 2;
$dataSize = 100000; // Taille des données audio,Supposer 100000 octet
$byteRate = $sampleRate * $channels * $bitsPerSample / 8;
$blockAlign = $channels * $bitsPerSample / 8;
// structure WAV En-tête de fichier
$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
);
// Sortie en tant que fichier réel
file_put_contents('output.wav', $header);
?>
Le script crée un en-tête de fichier output.wav , que vous pouvez ensuite joindre les données audio réelles pour générer un fichier wav jouable.
Les fichiers BMP utilisent également des en-têtes de format fixe, qui peuvent être construits à l'aide de Pack () .
<?php
$width = 100;
$height = 100;
$bitsPerPixel = 24;
$rowSize = (int)(($bitsPerPixel * $width + 31) / 32) * 4;
$imageSize = $rowSize * $height;
$fileSize = 54 + $imageSize; // 54 octet的头部 + Données d'image
$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
);
// En-tête de sortie vers le fichier
file_put_contents('output.bmp', $header);
?>
Ensuite, vous pouvez remplir chaque ligne de données de pixels (notez que chaque ligne de BMP doit être alignée de 4 octets) pour terminer le fichier image.
Problème de commande d'octets : les numéros multi-octets doivent considérer l'ordre de fin de la plate-forme et utiliser V ou N pour contrôler (Little Endian ou Big Endian).
Exigences d'alignement : BMP, WAV et d'autres formats ont des exigences strictes sur l'alignement des champs et l'ordre structurel. Lorsque vous utilisez Pack () , vous devez vous assurer que les champs correspondent à précis.
Débogage Sortie : vous pouvez utiliser bin2hex () ou déballer () pour voir si les résultats emballés répondent aux attentes.
Construire des en-têtes de fichiers complexes : peut être analysé manuellement et converti en appels pack () en combinaison avec les spécifications officielles du format. Par exemple, pour générer un bloc IHDR d'une tête audio ID3V2 ou PNG, assurez-vous de consulter les documents pertinents.