PHP Development တွင်တခါတရံတွင်ကျွန်ုပ်တို့သည်အချက်အလက်များကို binary strings များထဲသို့ကွန်ယက်ထုတ်လွှင့်ခြင်းသို့မဟုတ်ဖိုင်သိုလှောင်မှုအတွက်အဆင်ပြေသည်။ PHP မှပေးသော Pack function သည်ဤလိုအပ်ချက်ကိုရရှိနိုင်ပါသည်။ သို့သော်၎င်းသည်ရှုပ်ထွေးသောပုံစံကြိုးများဖြင့်ဖြတ်သန်းရန်လိုအပ်သည်။ ဤဆောင်းပါးသည် Pack function ကိုမည်သို့အသုံးပြုရမည်ကိုမိတ်ဆက်ပေးမည်ကိုမိတ်ဆက်ပေးမည်။
အထုပ် လုပ်ဆောင်မှု၏အခြေခံ syntax သည် -
string pack(string $format, mixed ...$values)
$ format သည် C သည် လက်မှတ်မထိုးသည့်ပုံစံကိုကိုယ်စားပြုသည့်ပုံစံကိုသတ်မှတ်သည်။ N သည် 16-bit endian endian integer စသည်ဖြင့်ဖြစ်သည်။
$ တန်ဖိုးများသည် သက်ဆိုင်ရာပုံစံဖြင့်အချက်အလက်ဖြစ်သည်။
ဥပမာအားဖြင့်, လက်မှတ်မထိုးထားသောစာလုံးနှစ်စောင်နှင့် 16-bit big-endian integer နှစ်ခုကိုထုပ်ပိုးထားသည်။
$data = pack('CCn', 0x01, 0x02, 0x1234);
ကျွန်ုပ်တို့ encapsatate လုပ်ချင်သော function ကို:
တန်ဖိုးများကို string နှင့်သက်ဆိုင်သောတန်ဖိုးများကိုလက်ခံသည်။
format string အရသိရသည်တန်ဖိုးများကိုအလိုအလျှောက် packet ကိုအလိုအလျောက် package ။
ဘုံ format အမျိုးအစားများကိုထောက်ပံ့ခြင်းနှင့်ချဲ့ထွင်ရန်အဆင်ပြေသည်။
မကိုက်ညီသော parameters များနှင့်ပုံစံများကိုကိုင်တွယ်သောအမှားများကိုကိုင်တွယ်ပါ။
ဥပမာ function ကိုလက်မှတ်
function universalPack(string $format, array $values): string
အောက်ဖော်ပြပါသည်အခြေခံအကောင်အထည်ဖော်မှု သည် အခြေခံ အကောင်အထည်ဖော်မှု ဖြစ်သည် ။
function universalPack(string $format, array $values): string {
$result = '';
$formatLength = strlen($format);
$valueIndex = 0;
for ($i = 0; $i < $formatLength; $i++) {
$char = $format[$i];
$repeat = 1;
// မိတ္တူပွားများရှိရှိမရှိ detect,ကဲ့သို့a4、C2စောင့်
if (isset($format[$i + 1]) && ctype_digit($format[$i + 1])) {
$repeat = (int)$format[$i + 1];
$i++;
}
for ($r = 0; $r < $repeat; $r++) {
if (!isset($values[$valueIndex])) {
throw new InvalidArgumentException("တန်ဖိုးအရေအတွက်သည်ပုံစံနှင့်မကိုက်ညီပါ");
}
$value = $values[$valueIndex];
$valueIndex++;
switch ($char) {
case 'C': // လက်မှတ်မထိုးဇာတ်ကောင်
$result .= pack('C', $value);
break;
case 'n': // 16bit bit endian byte အမိန့် bit
$result .= pack('n', $value);
break;
case 'N': // 32bit bit endian byte အမိန့် bit
$result .= pack('N', $value);
break;
case 'a': // NULstring ကိုဖြည့်ပါ,အားဖြင့်အရှည်repeatဆုံးဖြတ်
if ($repeat < 1) {
throw new InvalidArgumentException("aformat ကိုအရှည်အတွက်သတ်မှတ်ခံရဖို့လိုအပ်ပါတယ်");
}
$str = str_pad(substr($value, 0, $repeat), $repeat, "\0");
$result .= $str;
// aအားလုံးချက်ချင်း processing processingrepeat,valueIndexအဘယ်သူမျှမတိုး
$valueIndex--;
break;
default:
throw new InvalidArgumentException("မထောက်ပံ့ format ကိုဇာတ်ကောင်: $char");
}
}
}
return $result;
}
သင် data packet တစ်ခုကိုထုပ်လိုပါကဖွဲ့စည်းပုံမှာ -
1 byte command နံပါတ် ( ဂ )
2 byte ဒေတာအရှည် ( ) )
4 byte ဒေတာ ID ( n )
10 byte ဒေတာအကြောင်းအရာ (String, A10 )
ခေါ်ဆိုမှုဥပမာ -
$command = 0x01;
$length = 14;
$dataId = 123456;
$content = "hello";
$packed = universalPack('CnNa10', [$command, $length, $dataId, $content]);
echo bin2hex($packed);
output ကို:
01000e0001e24068656c6c6f0000000000
Pack လုပ်ဆောင်ချက်များသည်အလွန်အစွမ်းထက်သော်လည်း, ပုံစံနှင့်တန်ဖိုးသည်တိုက်ရိုက်အသုံးပြုသောအခါအမှားအယွင်းများကိုပြလေ့ရှိသည်။
Multi-format data packaging ၏ထုပ်ပိုးမှုကိုရိုးရှင်းစေရန် Universal UniversalPaltack function ကို oncapsultate ။
သေးငယ်သောပုံစံများကိုပံ့ပိုးပေးခြင်း,
အမှန်တကယ်စီမံကိန်းများအနေဖြင့် unpack function ကို peer unpacking function ကိုရရှိရန် unpack function နှင့်ပေါင်းစပ်နိုင်သည်။