سؤال

لدي بعض الرمز 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() لتنسيق النتيجة بشكل صحيح.

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