Неделю точно. Но в разные время разные его части писались. И дело забивалось не раз из-за занятости.
Тут просто нигде информации не было по структуре. Особенно строк. Там длина упорото заэнкожена + по ней определяется - UCS-2LE или CP1251.
Пришлось методом тыка.
Например:
(можно было бы укоротить, но пофиг)
public function readASCF() {
if (!isset($this->data[$this->offset + 1]))
throw new Exception("Can't read ASCF! Unexpected EOF at ".($this->offset + 1));
$a = ord($this->data[$this->offset]);
$b = ord($this->data[$this->offset + 1]);
if ($a > 0x80 && $a < 0xC0) {
$len = $a & ~0x80;
$start = $this->offset + 1;
if ($start + $len * 2 + 1 >= strlen($this->data))
throw new Exception("Can't read ASCF! Unexpected EOF at ".$start);
$this->offset += 1 + $len * 2;
return @iconv("UCS-2LE", "UTF-8", substr($this->data, $start, $len * 2));
} else if ($a >= 0xC0 && $a <= 0xFF) {
$n = ($b - ($b % 2)) / 2;
$len = (($a & ~($b % 2 == 0 ? 0xC0 : 0x80)) + ($n * 0x80));
$start = $this->offset + 2;
if ($start + $len * 2 + 2 >= strlen($this->data))
throw new Exception("Can't read ASCF! Unexpected EOF at ".$start);
$this->offset += 2 + $len * 2;
return @iconv("UCS-2LE", "UTF-8", substr($this->data, $start, $len * 2));
} else if ($a < 0x40) {
if (!$this->offset + 1 + $a >= strlen($this->data))
throw new Exception("Can't read ASCF! Unexpected EOF at ".($this->offset + 1));
$data = substr($this->data, $this->offset + 1, $a);
$this->offset += 1 + $a;
to_encoding($data, "UTF-8");
return $data;
} else if ($a >= 0x40) {
$n = ($b - ($b % 2)) / 2;
$len = (($a & ~($b % 2 == 0 ? 0xC0 : 0x80)) + ($n * 0x80));
if (!$this->offset + 2 + $len >= strlen($this->data))
throw new Exception("Can't read ASCF! Unexpected EOF at ".($this->offset + 2));
$data = substr($this->data, $this->offset + 2, $len);
$this->offset += 2 + $len;
to_encoding($data, "UTF-8");
return $data;
}
}