လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Unpack () မှားယွင်းသောအချက်အလက်များကိုရရှိသည်။ ဒီတစ်ခါလည်း pack ၏ format ကို () မမှန်ကန်ပါ

Unpack () မှားယွင်းသောအချက်အလက်များကိုရရှိသည်။ ဒီတစ်ခါလည်း pack ၏ format ကို () မမှန်ကန်ပါ

M66 2025-05-28

PHP, POSP () နှင့် ဖြည်ချခြင်း တို့တွင် binary data များပြုလုပ်သောအခါအချက်အလက်များကို binary strings များသို့မဟုတ်၎င်းတို့ထံမှမူရင်းတန်ဖိုးများကိုပြောင်းလဲနိုင်သောအစွမ်းထက်သောလုပ်ဆောင်ချက်များဖြစ်သည်။ သို့သော် developer များစွာသည်ဤလုပ်ဆောင်ချက်နှစ်ခုကိုအသုံးပြုသောအခါအဘယျဘုံပြ problem နာကိုကြုံတွေ့ရလေ့ရှိသည် - အထုပ်နှင့်အတူထုပ်ပိုးထားသည့်ဒေတာ () တွင်ထုပ်ပိုးခြင်း () အုတ်မြစ် () တွင်ခြွင်းချက်များပေါ်လာသည်။ ဤအခြေအနေသည်အများအားဖြင့်အများအားဖြင့် mougr formating strings ကြောင့်ဖြစ်သည်။

ဘုံ "garbled" ဇာတ်လမ်း

သင့်တွင်ကိန်းနှင့်ကြိုးတစ်ခုရှိပြီး၎င်းတို့ကို binary data store သို့မဟုတ်လွှဲပြောင်းခြင်းသို့ထည့်သွင်းလိုပါက၎င်းတို့ကိုဖြည်ယူပြီးပြန်လည်အသုံးပြုပါ။

 $data = pack('N/A4', 12345678, 'test');

လူအများစုကအထက်ပါကုဒ်သည် 12345678 နှင့် string string ကို မှန်ကန်စွာတပ်ဆင်လိမ့်မည်ဟုထင်မြင်ကြပေမည်။ သို့သော်ကွပ်မျက်သည့်အခါ ဖြည့်စွက်ခြင်းဖြင့် ဖြေရှင်းနိုင်သည့်အချက်အလက်များသည်သင်ဆန္ဒအလျောက်မဟုတ်ကြောင်းသင်တွေ့လိမ့်မည်။

 $unpacked = unpack('Nnum/A4str', $data);
print_r($unpacked);

output သည်ဗလာ,

အကြောင်းပြချက်? format string ကိုမှားယွင်းစွာရေးသားထားပါတယ်။

အကယ်. 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) ကိုကိုယ်စားပြုသည်။

သင်မှားယွင်းသောစာကိုအသုံးပြုပါကရလဒ်သည်လုံးဝမှားလိမ့်မည်။

byte alignment: ကိုယ့်ကိုယ်ကိုဖွဲ့စည်းပုံကိုမခန့်မှန်းပါနှင့်

အကယ်. သင်သည် 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 ကိုမှန်ကန်စွာရေးသားခြင်းရှိမရှိကိုအရင်စစ်ဆေးပါ။