ProfiPHPProfiPHP
Категория: Полезное в PHP

Работа с бинарными данными в PHP

Большинство PHP программистов создают огромные проекты, разрабатывают десятки или даже сотни веб-ресурсов и могут никогда не иметь напрямую дело с бинарными данными. Все это потому, что далеко не для всех проектов необходимо использовать бинарные файлы. Но разработчики используют их скрыто для себя из разнообразных библиотек или расширений.

Для работы с бинарными данными существуют функции Pack и Unpack. Функция Pack запаковывает данные в необходимом формате по маске, и в результате мы получаем строку в бинарном формате. Функция Unpack выполняет обратное преобразование, то есть на входе указываем строку в бинарном формате и результатом получаем массив с данными в привычном нам формате.

Продемонстрируем практически процесс создания бинарных файлов и их использования. В файл будем записывать числа от 0 до 256, а значит, данные числа уместятся в тип Char. Данная строка может содержать любое количество символов. Запишем в файл числа простым способом:
$data = '';
for ( $i = 0; $i < 256; $i++ ) {
$data .= $i;
}
file_put_contents( $_SERVER['DOCUMENT_ROOT'].'/data.txt', $data );
А теперь с использованием функции Pack, которая будет запаковывать каждый байт по отдельности:
$data = '';
for ( $i = 0; $i < 256; $i++ ) {
$data .= pack( "c", $i );
}
file_put_contents( $_SERVER['DOCUMENT_ROOT'].'/data.bin', $data );
Сравниваем размеры получившихся файлов:
data.txt – 658 KB
data.bin - 256 KB
По результате видно, что файл, который был создан с упаковыванием всех значений, почти в три раза меньше файла с традиционной записью данных.

При разборе внутренней структуры файлов можно увидеть, что в файле data.txt информация сохраняется в открытом читаемом виде, а в файле data.bin в бинарном нечитабельном формате.

Для считывания запакованных данных используем функцию Unpack:
$data = file_get_contents( $_SERVER['DOCUMENT_ROOT'].'/data.bin' );
$array = unpack( 'c*', $data );
Результатом будет массив, который можно уже использовать для необходимых операций.

Добавить комментарий

Имя:
Текст комментария: