2009-07-18 12 views
8

मेरे पास PHP में एक स्ट्रिंग है (कुछ डेटा स्रोत से आया है), जो प्रारूपित 32-बिट पूर्णांक का प्रतिनिधित्व करता है। मुझे इसे 32-बिट पूर्णांक के रूप में एक MySQL डेटाबेस में संग्रहीत करने की आवश्यकता है, ताकि बाद में मैं इसे PHP से पुनर्प्राप्त कर सकूं और इसे (संभावित रूप से नकारात्मक) हस्ताक्षरित पूर्णांक स्थिरांक के रूप में उपयोग कर सकूं (क्योंकि PHP में हस्ताक्षरित पूर्णांक नहीं हैं)।बिना हस्ताक्षर किए गए 32S बिट पूर्णांक को MySQL या PHP में साइन इन करने के लिए कैसे?

तो, मुझे जो चाहिए वह एक रूपांतरण विधि है, या तो PHP या MySQL के लिए। यह मंच-निर्भर नहीं होना चाहिए (कोई एंडियन/32/64-बिट समस्या नहीं)।

मैं कैसे अहस्ताक्षरित MySQL का उपयोग करते हुए एक हस्ताक्षरित पूर्णांक कन्वर्ट करने के लिए पता है:

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

लेकिन मैं इसे दूसरी तरह के आसपास काम नहीं प्राप्त कर सकते हैं (ध्यान दें: MySQL 64-बिट अंकगणितीय जब डाले कर उपयोग करता है)।

धन्यवाद।

उत्तर

0

यह:

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

काम करने के लिए लगता है, भले ही यह कुछ हद तक धीमी है।

3

यदि आप सिर्फ PHP में एक पूर्णांक में संख्या डालें, तो यह चाल करेगा।

echo (int)3232240316 . "\n"; 

देता

-1062726980 

नोट: यदि आप PHP में एक अहस्ताक्षरित int को एक हस्ताक्षरित पूर्णांक कास्ट करना चाहते हैं, तो बस इस कार्य करें:

$number += 4294967296; 

उदाहरण:

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

देता है:

-1062726980 
3232240316 
+1

क्षमा करें, लेकिन यह 64-बिट सिस्टम पर काम नहीं करेगा, जहां PHP int डिफ़ॉल्ट रूप से 64-बिट है। – Alex

संबंधित मुद्दे