Реализовать readInt и readUTF для работы с php-файлом?

Если мои writeInt () и writeUTF () выглядят так:

function write_int($value)
{
$data = pack('N', $value);
fwrite($this->file, $data);    #$this->file is get by fopen($path,"wb")
}

function write_utf($value)
{
$this->write_int(strlen($value));
fwrite($this->file,$value);
}

Как это читать? Я попробую :

function read_int()
{
$data = fread($this->file, 4);        #$this->file is get by fopen($path,"rb")
return unpack('N', $data);            #unpack return array , not int
}

function read_utf($value)
{
$l = $this->read_int();               #unpack return array , not int
return fread($this->file,$l);         #type mismatch
}

Вы можете увидеть несоответствие типа.

Кстати вы можете изменить формат моего writeInt и writeUTF. Я только хочу способ писать и читать для файла

0

Решение

Эта функция возвращает двоичные данные переменной, которую вы читаете. Вы должны составить его в нужный тип данных. В случае int, например, чтение документа http://php.net/manual/en/function.pack.php говорится, что N упакует 4-байтовое длинное целое число в массив байтов с прямым порядком байтов.

Этот код показывает, как его восстановить

function read_int()
{
$data = fread($this->file, 4);        #$this->file is get by fopen($path,"rb")
$raw = unpack('N', $data);            #unpack return array , not int
$val = (($raw[3] & 0xff) | ($raw[2] << 16) & 0xff00 | ($raw[1]  << 8) & 0xff0000 | ($raw[0] << 24) & 0xff0000);
return $val;
}

Вы можете использовать эту логику для перестройки других переменных. В случае Strings байт является просто int-символом, поэтому вам нужно только привести его.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]