Записать двоичные данные в файл, буквально

У меня есть массив целых

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

И так далее, я полагаю, если я смотрю на это так, как если бы это была база данных — элементы самого внешнего массива — это строки, а элементы внутренних массивов — это столбцы.

Я хочу сохранить эту информацию в файл, чтобы позже ее можно было найти, но я хочу сохранить ее как двоичные данные, чтобы сэкономить место. В основном, если я напишу первое целое число из примера 1531412763 в файл это займет 10 байтов, но если бы я мог сохранить его как целое число со знаком, это заняло бы 4 байта.

Я посмотрел на ряд других ответов, которые все предлагают использовать fwrite что я не могу понять, как использовать таким образом?

6

Решение

Для записи двоичных данных в файл вы можете использовать функции 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);
5

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

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