WebSocket 서버를 PHP로 만들 때 handshake 데이터를 계산할 때 주의사항이 있다.
PHP는 unsigned integer를 지원하지 않는다.
그래서 큰 수가 필요하면 float 형으로 형변환해서 계산하면 되지만, 기본적으로 정수와 실수는 데이터의 저장형태가 달라서 같은 연산결과를 기대할 수 없는 경우가 있다.
특히 handshake 에서 /key-number_N/ 과 /spaces_N/ 값을 이용하여 유효성 검사를 할 때,
나머지 연산을 하게 되는데 /key-number_N/ 값이 10자리의 숫자이므로 PHP integer의 한계치인 32-bit signed integer 의 범위를 넘어가기 십상이다.
그렇다고 float으로 형변환 한 다음 수행하는 나머지 연산은 절망만을 안겨준다...-_-;
그래서 나머지 연산을 위한 함수같은게 따로 하나 필요하다.
아래의 함수같은 것.
function mod($a, $b)
{
$mod = '';
$a = strval($a);
$b = strval($b);
$len = strlen($a);
for ($i=0; $i<$len; $i++) {
$x = $mod.$a[$i];
$mod = $x % $b;
}
return $mod;
}
{
$mod = '';
$a = strval($a);
$b = strval($b);
$len = strlen($a);
for ($i=0; $i<$len; $i++) {
$x = $mod.$a[$i];
$mod = $x % $b;
}
return $mod;
}
'PHP' 카테고리의 다른 글
[PHP] in_array 사용시 integer 0 주의 (0) | 2011.04.26 |
---|---|
[PHP] 유니코드 변환 (\uXXXX) (6) | 2011.03.14 |
[PHP] 대용량 파일업로드를 위한 설정 (ini settings for upload large size file) (0) | 2010.11.22 |
[PHPUnit] echo를 하는 함수의 테스트 (0) | 2010.11.01 |
[PHP] 생성되지 않는 파일명, 디렉토리명 (invalid file name, directory name) (0) | 2010.10.28 |