الدالة unpack()‎ في PHP

من موسوعة حسوب
< PHP
اذهب إلى التنقل اذهب إلى البحث

تفك الدالةُ unpack()‎ تحزيم البيانات من سلسلة نصية ثنائية.

الوصف

array unpack ( string $format , string $data [, int $offset = 0 ] )

تفك الدالةُ unpack()‎ البيانات من سلسلة نصية ثنائية في مصفوفة وفقا للمعامل format المعطى.

تُخَزَّنُ البياناتُ مفكوكة التحزيم في مصفوفة ترابطية. لتحقيق ذلك، عليك تسمية شيفرات التنسيق المختلفة وفصلها بشرطة مائلة /. إذا وُجِدَ وسيط مُكرِّر، سيكون لكل من مفاتيح المصفوفة رقمٌ تسلسليٌّ بعد الاسم المعطى.

المعاملات

format

انظر الدالة pack() للحصول على شرح رموز التنسيق.

data

البيانات المُجَمَّعة.

offset

الإزاحة التي يبدأ الفك منها.

القيم المعادة

تعيد الدالةُ unpack()‎ مصفوفة ترابطية تحتوي على عناصر مفكوكة من سلسلة نصية ثنائية.

سجل التغييرات

الإصدار الوصف
7.2.0 يدعم نوعا البيانات float وdouble معًا كلا من Big Endian و Little Endian.
7.1.0 أُضِيْفَتْ الإزاحةُ الاختيارية.
5.5.0 أُجْرِيَتْ تغييرات لجعل هذه الدالة متوافقة مع Perl:

يحتفظ الرمز "a" الآن بـ NULL بايت زائدة.

يحذف رمز "A" الآن كل مسافات ASCII البيضاء الزائدة (المسافات، علامات التبويب، السطور الجديدة، حرف الإعادة و NULL بايت).

أمثلة

المثال 1: مثال على الدالة unpack()

<?php
$binarydata = "\x04\x00\xa0\x00";
$array = unpack("cchars/nint", $binarydata);
print_r($array);
?>

ناتج المثال السابق:

Array
(
  [chars] => 4
 [int] => 160
)

المثال 2: مثال على الدالة unpack()‎ مع مُكرِّر

<?php
$binarydata = "\x04\x00\xa0\x00";
$array = unpack("c2chars/nint", $binarydata);
print_r($array);
?>

ناتج المثال السابق:

Array
(
  [chars1] => 4
  [chars2] => 0
  [int] => 40960
)

ملاحظات

تحذير: لاحظ أن PHP تخزن داخليًا القيم الصحيحة على أنها مؤشرة. إذا فككتَ بيانات ضخمةً من نوع البيانات long غير المُؤشر وكانت بنفس حجم قيم PHP المخزنة داخليًا، فستكون النتيجة رقمًا سالبًا حتى لو حُدِّدَنا أنَ عملية فَكٌّ التحزيم ستكون غير مؤشَّرة.

تحذير: إذا لم تُسَمِّ عنصرًا، فستُستخدَم المؤشرات الرقمية التي تبدأ من 1. اعْلَم أنه إذا كان لديك أكثر من عنصر واحد غير مسمى فسَتُسْتَبْدَلُ بعضُ البيانات لأنَّ الترقيم يعاد بداية من 1 لكل عنصر.

المثال 3: مثال على الدالة unpack()‎ مع مفاتيح غير مسماة

<?php
$binarydata = "\x32\x42\x00\xa0";
$array = unpack("c2/n", $binarydata);
var_dump($array);
?>

ناتج المثال السابق:

array(2) {
 [1]=>
 int(160)
 [2]=>
 int(66)
}

لاحظ أنه يُكتب فوق القيمة الأولى من محدد c بواسطة القيمة الأولى من محدد n.

انظر أيضًا

  • الدالة pack()‎: تحزيم البيانات في سلسلة نصية ثنائية.

مصادر