엑셀파일 읽을 때 사용하는 SpreadSheet_Excel_Reader가 64비트 CPU에서 오동작 함.
GetInt4d() 라는 함수에서 일어나는 문제인데,
위치값을 계산할 때 관계연산자와 쉬프트연산자를 이용한다.
하지만 해당 결과값이 32비트 기준으로 되어 있어서,
원래라면 Int 최대값을 넘어서 음수로 되어야 할 부분이 그대로 양수로 표현되는 오류가 있음.
64비트 CPU에서 호환될 수 있도록 마지막 4바이트 부분을 처리하는 게 인터넷에 올라와 있어서 기록해 둠.
GetInt4d() 함수를 아래처럼 수정하면 됨.
function GetInt4d($data, $pos) {
$_or_24 = ord($data[$pos+3]);
if ($_or_24>=128) $_ord_24 = -abs((256-$_or_24)<<24);
else $_ord_24 = ($_or_24&127)<<24;
return ord($data[$pos]) | (ord($data[$pos+1])<<8) | (ord($data[$pos+2])<<16) | $_ord_24;
}
$_or_24 = ord($data[$pos+3]);
if ($_or_24>=128) $_ord_24 = -abs((256-$_or_24)<<24);
else $_ord_24 = ($_or_24&127)<<24;
return ord($data[$pos]) | (ord($data[$pos+1])<<8) | (ord($data[$pos+2])<<16) | $_ord_24;
}
'PHP' 카테고리의 다른 글
[PHP Extension] PHP Extension 만들기 (Visual C++ 2008) (5) | 2010.07.19 |
---|---|
[PHP] 원본 문자열에서 특정 문자열의 위치를 모두 추출하여 반환 (0) | 2010.07.14 |
[PHP] UTF-8 BOM 떼어 내기 (0) | 2010.05.24 |
[PHP] debug_backtrace() - 함수호출 스택 디버깅 (0) | 2010.04.09 |
[PHP] constant() 함수 (0) | 2010.04.08 |