PHP, POSP () နှင့် ဖြည်ချခြင်း တို့တွင် binary data များပြုလုပ်သောအခါအချက်အလက်များကို binary strings များသို့မဟုတ်၎င်းတို့ထံမှမူရင်းတန်ဖိုးများကိုပြောင်းလဲနိုင်သောအစွမ်းထက်သောလုပ်ဆောင်ချက်များဖြစ်သည်။ သို့သော် developer များစွာသည်ဤလုပ်ဆောင်ချက်နှစ်ခုကိုအသုံးပြုသောအခါအဘယျဘုံပြ problem နာကိုကြုံတွေ့ရလေ့ရှိသည် - အထုပ်နှင့်အတူထုပ်ပိုးထားသည့်ဒေတာ () တွင်ထုပ်ပိုးခြင်း () အုတ်မြစ် () တွင်ခြွင်းချက်များပေါ်လာသည်။ ဤအခြေအနေသည်အများအားဖြင့်အများအားဖြင့် mougr formating strings ကြောင့်ဖြစ်သည်။
သင့်တွင်ကိန်းနှင့်ကြိုးတစ်ခုရှိပြီး၎င်းတို့ကို binary data store သို့မဟုတ်လွှဲပြောင်းခြင်းသို့ထည့်သွင်းလိုပါက၎င်းတို့ကိုဖြည်ယူပြီးပြန်လည်အသုံးပြုပါ။
$data = pack('N/A4', 12345678, 'test');
လူအများစုကအထက်ပါကုဒ်သည် 12345678 နှင့် string string ကို မှန်ကန်စွာတပ်ဆင်လိမ့်မည်ဟုထင်မြင်ကြပေမည်။ သို့သော်ကွပ်မျက်သည့်အခါ ဖြည့်စွက်ခြင်းဖြင့် ဖြေရှင်းနိုင်သည့်အချက်အလက်များသည်သင်ဆန္ဒအလျောက်မဟုတ်ကြောင်းသင်တွေ့လိမ့်မည်။
$unpacked = unpack('Nnum/A4str', $data);
print_r($unpacked);
output သည်ဗလာ,
အကြောင်းပြချက်? format string ကိုမှားယွင်းစွာရေးသားထားပါတယ်။
Pack of of Pack () နှင့် ဖြည့်တင်းခြင်း () unpack () format strings () သည်အတိအကျသာမကအရှည်, အရွယ်အစားနှင့်အမျိုးအစားနှင့်ကိုက်ညီရမည်။
အထက်ပါအမှားဥပမာကိုဂရုတစိုက်ဆန်းစစ်ကြည့်ရအောင်။
$data = pack('N/A4', 12345678, 'test');
ဤပုံစံ string ကိုအမှန်တကယ်တရားဝင်မဟုတ်ပါဘူး။ ဘာဖြစ်လို့လဲဆိုတော့ N သည် 4 byte လက်မှတ်မထိုးနိုင်သည့်သက်တမ်းရှိ (Big-endian) ကိုကိုယ်စားပြုသောကြောင့် သို့မဟုတ် တရားမ 0 င်သောဇာတ်ကောင် (ဤအခြေအနေတွင်အဓိပ္ပာယ်မရှိပါ) ရေးသားဖို့တကယ့်နည်းလမ်းဖြစ်သင့်သည်။
$data = pack('Na4', 12345678, 'test');
ဖြည်ချသည့်အခါ, သင်သည်တူညီသောပုံစံကိုတင်းကြပ်စွာ align လုပ်ရမည်။
$unpacked = unpack('Nnum/a4str', $data);
ဤအချိန်တွင် output သည်ကျွန်ုပ်တို့မျှော်လင့်ထားသည့်အရာဖြစ်သည်။
Array
(
[num] => 12345678
[str] => test
)
သိမ်မွေ့သောခြားနားချက်ကိုသတိပြုပါ။
A4 ဆိုသည်မှာ string သည်အလွန်ရှည်လျားသည်ဖြစ်စေမဟုတ်သည်ဖြစ်စေ "အချည်းနှီးသော bytes နှင့်ပြည့်စုံ" ဟုဆိုလိုသည်။
A4 ဆိုသည်မှာ "နေရာများနှင့်ပြည့်စုံသောကြိုး" ကိုဆိုလိုသည်။
n ဆိုသည်မှာ 2 byte လက်မှတ်မပြည့်စုံသော (Big Endian),
v ကိုဆိုလိုသည်မှာ 2 byte သည်လက်မှတ်မပြည့်မီ (Little endian),
n ဆိုသည်မှာသက်တမ်းကြာမြင့်သည် (Big Endian) ကိုလက်မှတ်မထိုးပါ။
V ကိုလက်မှတ်ထိုးခြင်း 4 ခု (Little Little Little's) ကိုကိုယ်စားပြုသည်။
သင်မှားယွင်းသောစာကိုအသုံးပြုပါကရလဒ်သည်လုံးဝမှားလိမ့်မည်။
အကယ်. သင်သည် Cross-Platform data standard statude သို့မဟုတ် binary protocols များကိုကိုင်တွယ်ဖြေရှင်းနေပါက M66.net မှဒေါင်းလုပ်လုပ်ထားသော client client client client client protocol) ကိုသင်ပိုမိုအာရုံစိုက်သင့်သည်။
ဥပမာအားဖြင့် Packet ဖွဲ့စည်းပုံကိုအောက်ပါအတိုင်းသတ်မှတ်ပါ -
2 byte ဗားရှင်းနံပါတ် (uint16)
4 byte timestamp (uint32)
8 byte အသုံးပြုသူ ID (UMM64)
20 byte username (string)
ရေးသားနိုင်ပါသည်:
$data = pack('nNVa20', 1, time(), 123456789, 'hello');
သက်ဆိုင်ရာဖြန့်ချောက်သည်အတိအကျတူညီရမည် -
$unpacked = unpack('nversion/Ntime/Vuid/a20username', $data);
သို့သော်မှတ်ချက်။ ။ V နှင့် n ၏အမိန့်ကိုမရောထွေးပါနှင့်! အကယ်. ဆာဗာသည် Byte အမိန့်သည် Byte အမိန့်သည် Byte အမိန့်သည် BY-Endian ဖြစ်သည်ဟုသတ်မှတ်ရန်အသုံးပြုပါက၎င်းကိုဖတ်ရန် V (Endian-endian) ကိုအသုံးပြုပါကဖြေရှင်းနည်းသည်မှားသည်။
format string အမှားအယွင်းများကိုရှောင်ရှားရန်ဖွဲ့စည်းပုံအဓိပ္ပာယ်ဖွင့်ဆိုချက်များကိုအမြဲအနိုင်ပြုပြင်ထိန်းသိမ်းမှုနှင့်ပူးပေါင်းဆောင်ရွက်မှုအတွက်ရှင်းလင်းစွာမှတ်ချက်ပေးရန်လုပ်ဆောင်ချက်များကိုထည့်သွင်းရန်အကြံပြုသည်။ ဥပမာအားဖြင့်:
define('USER_STRUCT_FORMAT', 'nversion/Ntime/Vuid/a20username');
function encodeUser($version, $time, $uid, $username) {
return pack(USER_STRUCT_FORMAT, $version, $time, $uid, $username);
}
function decodeUser($binary) {
return unpack(USER_STRUCT_FORMAT, $binary);
}
၎င်းသည်လက်ဖြင့်စာလုံးပေါင်းပုံစံများကိုနေရာများစွာဖြင့်လက်ဖြင့်ပြုလုပ်သောအမှားများကိုရှောင်ရှားနိုင်ပြီးစာရွက်စာတမ်းထပ်တူပြုခြင်းကိုလည်းလွယ်ကူချောမွေ့စေသည်။
Pack () နှင့် ဖြည့်ဆူး () ကို အသုံးပြုခြင်းသည် PHP တွင် binary data များကိုပြုလုပ်ရန်စံပြနည်းလမ်းဖြစ်သည်, သို့သော်ပုံစံကြိုးများတပ်ဆင်ရန်လိုအပ်ချက်များသည်အလွန်တင်းကျပ်သည်။ barbled code ကိုဖြုတ်ချခြင်းကအချိန်အများစုမှာ function ပြ problem နာမဟုတ်ပါဘူး။ သတိရပါ:
အမျိုးအစားတစ်ခုချင်းစီ၏ bytes ၏အဓိပ္ပာယ်နှင့်အရေအတွက်,
သေးငယ်ပြီးစွန်းတိုင်အောင်အမိန့်ကိုမမှားနိုင်;
အဆိုပါ unpacking အမိန့်နှင့်ထုပ်ပိုးအမိန့်ကိုက်ညီမှုရှိရမည်;
string ၏အရှည်ကို fixed သို့မဟုတ်ရှင်းလင်းစွာဖော်ပြထားသည်;
လွယ်ကူသောပြန်လည်သုံးသပ်ရန်တည်ဆောက်မှုဆိုင်ရာထုပ်ပိုးမှုသည်စည်းလုံးညီညွတ်မှုကိုစည်းလုံးညီညွတ်စေရန်ရည်ရွယ်ထားသည်။
နောက်တစ်ခါသင် Unpack () garbled code ကိုကြုံတွေ့ရသည် () carbled code ကိုသံသယမထားပါနှင့်။ သင်၏ format string ကိုမှန်ကန်စွာရေးသားခြင်းရှိမရှိကိုအရင်စစ်ဆေးပါ။