为php文件操作实现readInt和readUTF?

时间:2016-04-01 09:59:32

标签: php file stream filereader filewriter

如果我的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的格式。我只想要一种写文件的方法

1 个答案:

答案 0 :(得分: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;
}

您可以使用此逻辑重建其他变量。在字符串的情况下,字节只是字符的int val,所以你只需要转换它。