MySQL 또는 PHP에서 서명되지 않은에서 32 비트 정수를 캐스팅하는 방법은 무엇입니까?

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

문제

PHP (일부 데이터 소스에서 나왔음)에 문자열이 있으며, 이는 서명되지 않은 32 비트 정수를 나타냅니다. MySQL 데이터베이스에 저장해야합니다. 서명 32 비트 정수, 나중에 PHP에서 검색하여 (PHP에 서명되지 않은 정수가 없기 때문에) (부정적인) 서명 된 정수 상수로 사용할 수 있습니다.

따라서 필요한 것은 PHP 또는 MySQL의 변환 방법입니다. 플랫폼 의존적이어서는 안됩니다 (Endian / 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

참고 : PHP의 서명되지 않은 int에 서명 된 int를 캐스트하려면 다음을 수행하십시오.

$number += 4294967296;

예시:

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

제공 :

-1062726980
3232240316
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top