엑셀파일 읽을 때 사용하는 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;
}




Posted by bloodguy
,