كيفية إجبار PHP على علاج رقم مثل UINT
سؤال
لدي بعض الرمز C# الذي يبدو هكذا:
uint a = 0x9E3779B9;
a += (uint)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));
بعد هذا الرمز ، A == 228 452 386
الآن أحاول ترجمة رمز C# هذا إلى PHP ، ولكن في PHP لا يفيض الرقم بنفس الطريقة:
$a = 0x9E3779B9;
$a += ($url[$k+0] + ($url[$k+1] << 8) + ($url[$k+2] << 16) + ($url[$k+3] << 24));
بعد هذا الرمز ، $ a == 4 523 419 682
في كلا COSES "url" يتم التعامل مع مجموعة من قيم ASCII. يعيد نفس النتائج حتى تتم إضافة اللحظة $ a إلى نتيجة السطر الثاني. عند هذه النقطة ، يفيض C# Uint إلى حوالي 228 مليون. يحصل PHP على "ذكي" ويأتي بالإجابة "الصحيح".
لكني أريد الإجابة المفرطة التي يعطيها C#. ماذا علي أن أفعل؟
المحلول
أضف $a &= 0xFFFFFFFF
لإعادة القيمة إلى نطاق 32 بت بعد الانتهاء من +=
.
(نرى: http://www.ideone.com/6br0u)
نصائح أخرى
لقد مرت بعض الوقت وقد تم بالفعل تقديم إجابة عمل ، لكنني أردت فقط تسليط الضوء على طريقة أسهل لأداء التفريغ الذي تقوم به:
$a = 0x9e3779b9;
$url = 'info';
$a = ($a + current(unpack('L', $url))) & 0xffffffff;
printf("%u\n", $a); // 228452387
أنا استخدم unpack()
لإجراء التحويل من الثنائي إلى UINT32 (ترتيب بايت الماكينة). على منصات 32 بت ، قد تصبح النتيجة النهائية سلبية ، وهذا هو السبب في أنني أستخدم أيضًا printf()
لتنسيق النتيجة بشكل صحيح.