سؤال

list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;

السؤال هو، لماذا "N*" لو substr يجب إرجاع 4 بايت، وسوف يتم تفريغها كما ن؟ ولماذا المهمة المزدوجة؟

محدث: هذا الرمز هو جزء من أبو الهول موصل PHP الأصلي. بعد بعض الكود اختراق، أصبح من الواضح أن هذا الرمز يستخلص عدد صحيح 4 بايت. ولكن المنطق وراء المهمة المزدوجة و substr / N* لا يزال غير واضح بالنسبة لي. أنا أقدم فضلته لفهمه أخيرا.

هل كانت مفيدة؟

المحلول

نحتاج إلى رؤية تاريخ مراجعة الملف ولكن بعض الاحتمالات هي:

  1. هذه هي بقايا خوارزمية سابقة تم تجريدها تدريجيا من الوظيفة ولكنها لم تنظف أبدا.
  2. إنها رمز السباغيتي النموذجي ننتجنا جميعا بعد ليلة سيئة.
  3. إنه تحسين يسرع رمز سلاسل الإدخال الكبيرة.

هذه هي جميع المرادفات:

<?php

$packed = pack('N*', 100, 200, 300);

// 1
var_dump( unpack('N*', $packed) );

// 2
var_dump( unpack('N*', substr($packed, 0, 4)) );
var_dump( unpack('N*', substr($packed, 4, 4)) );
var_dump( unpack('N*', substr($packed, 8, 4)) );

// 3
var_dump( unpack('N', substr($packed, 0, 4)) );
var_dump( unpack('N', substr($packed, 4, 4)) );
var_dump( unpack('N', substr($packed, 8, 4)) );

?>

فعلت المعيار النموذجي تكرار -000 مرات مع ثلاثة أعداد صحيحة و 1 هو وسيلة أسرع. ومع ذلك، فإن اختبار مماثل مع 10،000 أعداد صحيحة يظهر ذلك 1 هو الأبطأ: -!

0.82868695259094 seconds
0.0046610832214355 seconds
0.0029149055480957 seconds

كونه محرك نصي كامل حيث يكون الأداء أمرا ضروريا، أود أن أقول إنه تحسين.

نصائح أخرى

الكود ربما خطأ. هذا النوع من الحلقة هو بالضبط السبب * موجود ...

فك ("N *"، Substr (Response $، P، 4))؛

يحدد التنسيق المراد استخدامه عند تفريغ البيانات من Substr ()

N - غير موقعة طويلة، دائما 32 بت، ترتيب بايت نبيذ كبير

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top