hex=''; if (is_file($filename)) { $handle=fopen($filename,"r"); while (!feof($handle)) { $this->hex.=fgets($handle,filesize($filename)); } fclose($handle); } else { die ("$filename not exists!"); } } public function save($filename,$charinfo=false) { if (!$handle = fopen($filename, 'w')) { die("Can't open file $filename"); } if (!$charinfo) $this->setChecksum(); //вычислить CRC fwrite($handle, $this->hex); fclose($handle); } public function getValue($start,$length) { //выбрать срез строки return substr($this->hex, $start, $length); } public function setValue($hexstr,$start,$length) { //заменить срез строки значением $hexstr $this->hex=substr($this->hex, 0, $start) . $hexstr . substr($this->hex, $start+$length); } public function setName ($charname,$start=20) { //для charinfo $start = 48 $this->checkName($charname); $charname=str_pad($charname, 16,chr(0), STR_PAD_RIGHT); //заполнить все пустые справа $this->setValue($charname,$start,16); } public function checkName($charname) { if(!preg_match("/^[a-zA-Z-_]+$/", $charname) or strlen($charname)<3 or strlen($charname)>15) { die ("Имя должно быть 3-15 символов и содержать только буквы и _-
Name must contain 3-15 characters and allowed only letters, numeral and _-"); } } public function getName ($start=20) { //для charinfo $start = 48 $charname=$this->getValue($start,16); $charname=str_replace("?","",$charname); return $charname; } public function getCharinfo() { $charname=str_replace('?','',$charname); return $charname; } public function setUndead() { //снять dead $this->setValue("d",36,1); } public function setLock() { //отредактирован в php моем редакторе :-) $this->setValue("lock",52,4); } private function setChecksum() { $this->setValue(chr(0).chr(0).chr(0).chr(0), 12,4); //обнулить CRC $sum = 0; for($i=0;$i < strlen($this->hex);$i++) { $sum = sprintf('%032s',decbin($sum)); $sum = substr($sum,1) . substr($sum, 0, 1); $sum = bindec($sum); $sum += ord(substr($this->hex,$i,1)); } $this->setValue($this->dec2str($sum,true), 12,4); //записать CRC } private function dec2str($int,$reverse=false) { //число в строку(символы) $hex=dechex($int); $arr=str_split($hex,2); if ($reverse==true) $arr=array_reverse($arr); $str=""; foreach ($arr as $key=>$value) { $str.=chr(hexdec($value)); } return $str; } private function str2hex($str) { //строку в hex $hexStr=''; for ($i=0; $i