【问题标题】:Implement readInt and readUTF for php file operation?为php文件操作实现readInt和readUTF?
【发布时间】:2016-07-21 02:02:49
【问题描述】:

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

【问题讨论】:

    标签: php file stream filereader filewriter


    【解决方案1】:

    该函数返回您正在读取的变量的二进制数据。您必须将其组合成所需的数据类型。以 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,所以你只需要转换它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      相关资源
      最近更新 更多