///scr_checksum_get(buffer, size)
var pos = buffer_tell(argument0), sum = 0;
buffer_seek(argument0, buffer_seek_start, 0)
while(buffer_tell(argument0)<argument1){sum += buffer_read(argument0, buffer_u16)}
buffer_seek(argument0, buffer_seek_start, pos)
sum = (sum >> 16) + (sum & $ffff)
sum += (sum >> 16)
sum = ((~sum) & $ffff)
return sum
///scr_checksum_verify(buffer, size, checksum)
var pos = buffer_tell(argument0), sum = argument2;
buffer_seek(argument0, buffer_seek_start, 0)
while(buffer_tell(argument0)<argument1){sum += buffer_read(argument0, buffer_u16)}
buffer_seek(argument0, buffer_seek_start, pos)
sum = (sum >> 16) + (sum & $ffff)
sum += (sum >> 16)
sum = ((~sum) & $ffff)
if sum == 0{return true}
return false
사용하려고 만든 스크립트인데 체크섬이란 게 충돌이 잘 일어난다고 해서 그냥 CRC-32로 갈아타기로 했다.
일단은 이거 잘 되는 거 같긴 한데, 정말로 잘 되는지는 모른다.
위 스크립트의 체크섬은 2바이트이다.
마지막의 "sum = ((~sum) & $ffff)"은 게임메이커: 스튜디오(GameMaker: Studio)에서 실수를 8바이트로 처리하기에 음수를 없애기 위함이다.
만약 2바이트만을 필요로 한다면, 보다 나은 속도를 위해 "sum = ~sum"으로 바꾸어도 무방하다.