2009-07-18 15 views
8

私は、フォーマットされた符号なし32ビット整数を表すPHPの文字列をデータソースから取得しています。 の32ビット整数であることをMySQLデータベースに保存する必要があります。後でPHPから取得して(負の)符号付き整数定数として使用することができます(PHPは符号なし整数)。署名されていない署名からMySQLまたはPHPで署名された32ビット整数をキャストする方法はありますか?

私が必要とするのは、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でunsigned int型に署名したint型にキャストしたい場合は、ちょうどこの操作を行います。

$number += 4294967296; 

例:

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

は:

-1062726980 
3232240316 
+1

申し訳ありませんが、64ビットシステムでは動作しません.64ビットシステムでは、デフォルトで64ビットのPHPが使用されます。 – Alex

関連する問題