将二进制数据写入文件,字面上

时间:2016-10-04 12:01:28

标签: php filesystems binaryfiles binary-data

我有一个整数数组

Array
(
    [0] => Array
        (
            [0] => 1531412763
            [1] => 1439959339
            [2] => 76
            [3] => 122
            [4] => 200
            [5] => 4550
            [6] => 444
        )
...

依此类推,我想如果我把它看作是一个数据库 - 最外层数组的元素是行,内部数组的元素是列。

我想将该信息保存到文件中,以便稍后我可以检索它,但我想将其保存为二进制数据以节省空间。基本上,如果我将示例1531412763中的第一个整数写入文件,它将占用10个字节,但如果我可以将其保存为有符号整数,则需要占用4个字节。

我已经查看了其他一些答案,这些答案都建议使用fwrite我无法理解如何以这种方式使用?

1 个答案:

答案 0 :(得分:5)

要将二进制数据写入文件,您可以使用pack()unpack()函数。 Pack将生成二进制字符串。结果是一个字符串,您可以将整数连接成一个字符串。然后将此字符串作为一行写入您的文件。

通过这种方式,您可以轻松地使用file()进行阅读,这会将文件放入一个行数组中。然后只需unpack()每一行,你就可以恢复原来的数组了。

这样的事情:

$arr = array(
    array ( 1531412763, 1439959339 ),
    array ( 123, 456, 789 ),
);

$file_w = fopen('binint', 'w+');

// Creating file content : concatenation of binary strings 
$bin_str = '';
foreach ($arr as $inner_array_of_int) {
    foreach ($inner_array_of_int as $num) {
        // Use of i format (integer). If you want to change format
        // according to the value of $num, you will have to save the
        // format too.
        $bin_str .= pack('i', $num);
    }

    $bin_str .= "\n";
}

fwrite($file_w, $bin_str);
fclose($file_w);


// Now read and test. $lines_read will contain an array like the original.
$lines_read = [];
// We use file function to read the file as an array of lines.
$file_r = file('binint');

// Unpack all lines
foreach ($file_r as $line) {
    // Format is i* because we may have more than 1 int in the line
    // If you changed format while packing, you will have to unpack with the
    // corresponding same format
    $lines_read[] = unpack('i*', $line);
}

var_dump($lines_read);