كيفية إلقاء عدد صحيح 32 بت من غير موقعة للتوقيع في MySQL أو PHP؟

StackOverflow https://stackoverflow.com/questions/1147512

سؤال

لدي سلسلة في PHP (جاء من بعض مصدر البيانات)، والذي يمثل عددا صحيحا 32 بت مهيأ. أحتاج إلى تخزينها في قاعدة بيانات MySQL ك وقعت عدد صحيح 32 بت، بحيث يمكنني في وقت لاحق استرداده من PHP واستخدامه كمستمر عدد صحيح (ربما سلبي) ثابت (نظرا لأن PHP لا يحتوي على أعداد صحيحة غير موقعة).

لذلك، ما أحتاج إليه هو طريقة التحويل، إما ل PHP أو MySQL. لا ينبغي أن تكون تعتمد على المنصة (لا توجد مشاكل نبيذة / 32/64 بت).

أنا أعرف كيفية تحويل عدد صحيح موقع إلى غير موقعة باستخدام MySQL:

select CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER);
+------------------------------------------------------+
| CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER) |
+------------------------------------------------------+
|                                           3232240316 | 
+------------------------------------------------------+

لكنني لا أستطيع أن أحصل عليه العمل في الاتجاه الآخر (ملاحظة: يستخدم MySQL حساب حسابي 64 بت عند القيام بالألصقات).

شكرا.

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

المحلول 2

هذه:

$val = (bccomp("2147483647", $val) < 0) ? bcsub($val, "4294967296") : $val;

يبدو أن العمل، على الرغم من أنها بطيئة إلى حد ما.

نصائح أخرى

إذا قمت فقط بإلقاء الرقم على عدد صحيح في PHP، فسوف يقوم بذلك الخدعة.

echo (int)3232240316 . "\n";

اعطي

-1062726980

ملاحظة: إذا كنت ترغب في إلقاء it موقعة على int غير موقعة في PHP، فما عليك سوى القيام بذلك:

$number += 4294967296;

مثال:

$number = -1062726980;
echo $number . "\n";
$number += 4294967296;
echo $number . "\n";

يعطي

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