Binary Data ကိုထုတ်ပေးသည့်အခါ PHP သည်အလွန်အစွမ်းထက်သော function ကိုထောက်ပံ့ပေးသည် - Pack () ။ Metadata header header and format များဖန်တီးရန်အတွက် Metadata header information ကိုဖန်တီးရန် Metadata header header information ကိုဖန်တီးရန် Metadata header information ကိုဖန်တီးရန်အလွန်အသုံးဝင်သည် ။
အထုပ် ၏အခြေခံ syntax သည်အောက်ပါအတိုင်းဖြစ်သည် -
string pack(string $format, mixed ...$values)
$ format သည်တန်ဖိုးတစ်ခုစီကို Binary သို့မည်သို့ပြောင်းလဲသင့်သည်ကိုသတ်မှတ်သည့် format string တစ်ခုဖြစ်သည်။
$ တန်ဖိုးများသည် ပြောင်းလဲရန်တန်ဖိုးတစ်ခုသို့မဟုတ်တစ်ခုထက်ပိုသောတန်ဖိုးများဖြစ်သည်။
ဘုံပုံစံဇာတ်ကောင်များတွင်:
ဂ : လက်မှတ်မထိုးထားသောအက္ခရာများ (8 bits)
N : IFFIGNED မတိုသောကိန်း (16-bit, big-endian)
v : လက်မှတ်မထိုးထားသောကိန်းတို (16-bit, Small-endian)
N : လက်မှတ်မထိုးထားသောရှည်လျားသောကိန်းဂဏန်း (32-bit, big endian)
v : လက်မှတ်မထိုးထားသောရှည်လျားသော (32-bit, အသေးစား - endian)
A : nul string ကိုဖြည့်
A : Space သည် string ကိုဖြည့်သည်
WAV ဖိုင်၏ဖိုင် header သည် riff format ကိုအောက်ပါအတိုင်းလိုက်နာပြီးယေဘုယျအားဖြင့် 44-byte header ဖြင့်ဖွဲ့စည်းထားသည်။ ဤနေရာတွင်အနည်းငယ်မျှသာ WAV ဖိုင်ခေါင်းစဉ်ဆောက်လုပ်ရေး၏ဥပမာတစ်ခုဖြစ်သည်။
<?php
$sampleRate = 44100;
$bitsPerSample = 16;
$channels = 2;
$dataSize = 100000; // အသံဒေတာအရွယ်အစား,မှတ်ယူ 100000 ဒရယ်
$byteRate = $sampleRate * $channels * $bitsPerSample / 8;
$blockAlign = $channels * $bitsPerSample / 8;
// ဆောက်လုပ်ပုံ WAV header ဖိုင် 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
);
// အမှန်တကယ်ဖိုင်အဖြစ် output ကို
file_put_contents('output.wav', $header);
?>
script သည် playable wav file ကိုထုတ်လုပ်ရန်အမှန်တကယ်အသံအချက်အလက်များကိုပူးတွဲပေးနိုင်သည့် output header ကိုဖန်တီးနိုင်သည်။
BMP ဖိုင်များသည် pack ကို အသုံးပြု. တည်ဆောက်နိုင်သောပုံသေ format headers များကိုလည်းအသုံးပြုသည်။
<?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 မှ output header
file_put_contents('output.bmp', $header);
?>
ထို့နောက် pixel data တစ်ခုချင်းစီကိုသင်ဖြည့်စွက်နိုင်သည် (BMP ၏အတန်းတစ်ခုစီသည် 4 bmp တစ်ခုစီသည် 4 bytes align-bytes align လုပ်ရမည်) ကိုသတိပြုပါ။
Byte အမိန့်ပြ problem နာ
Alignment လိုအပ်ချက်များ - BMP, WAV နှင့်အခြားအမျိုးအစားများတွင်ကွင်းပြင်နှင့်ဖွဲ့စည်းတည်ဆောက်ပုံဆိုင်ရာအမိန့်များတွင်တင်းကျပ်သောလိုအပ်ချက်များကိုရှိသည်။ Pack ကိုအသုံးပြုတဲ့အခါ () , လယ်ကွင်းတွေဟာတိကျမှုနဲ့ကိုက်ညီအောင်သေချာအောင်လုပ်ရမယ်။
Debug output : ထုပ်ပိုးရတဲ့ရလဒ်တွေဟာမျှော်လင့်ချက်တွေရှိမရှိကြည့်ဖို့ bin2hex () ()) ကိုသုံးနိုင်တယ်။
ရှုပ်ထွေးသော File Headers များဖြင့်တည်ဆောက်ခြင်း - တရားဝင် format on သတ်မှတ်ချက်များနှင့်ပေါင်းစပ်ခြင်းနှင့် pack () ခေါ်ဆိုမှုများကိုကိုယ်တိုင်ခွဲခြမ်းစိတ်ဖြာနိုင်သည်။ ဥပမာအားဖြင့် ID3V2 Audio Head (သို့) PNG တစ်ခု၏ iHDR ကိုထုတ်လွှင့်ရန်သက်ဆိုင်ရာစာရွက်စာတမ်းများနှင့်တိုင်ပင်ရန်သေချာပါစေ။