Функції pack і unpack


Функції pack і unpack

Ймовірно більшість веб-програмістів ніколи не працювали безпосередньо з бінарними даними з php.

І так вийшло не тільки тому, що, найчастіше бінарну обробку беруть на себе різноманітні розширення або бібліотеки. Часто це пов'язано ще і з тим, що інформації в інтернеті не дуже багато, а та що є - складна для сприйняття і далека від потреб конкретного розробника.

Для читання і запису бінарних даних в php є дві корисні функції:

Функція pack запаковує дані в необхідному форматі, за нашою масці, і на виході віддає рядок в бінарному форматі.
Функція unpack виконує зворотне перетворення. Вона на вході очікує рядок в бінарному форматі і на виході віддає масив з даними в звичному нам форматі.

Для розуміння того, як упаковуються дані, потрібно прочитати про те як зберігаються дані в пам'яті. Наприклад з курсу мови програмування C.

Перевага бінарних даних

Припустимо: Нам потрібно записати в файл числа від нуля до 256. Важливо що б файл легко читався програмами на інших мовах і що б за розміром він займав мінімум місця.

записуємо дані

Традиційним способом ми б записували приблизно так:

Запаковивая кожен байт окремо, ми зробили б так:

Тепер порівняємо розміри одержані файлів:

Тобто файл де ми упакували все значення менше в байт, майже в три рази менше ніж файл де ми всі значення записували у вигляді рядка.

Так виглядає файл збережений звичайним способом:

А в цьому файлі значення були упаковані в char:

Уважний розробник відразу помітить причину такого розбухання файлу.

Це звичайно ж символ 0A. використовуваний як роздільник значень (0x0A = 10 = символ нового рядка), і те, що кожен з знаків у змінній зберігається в своєму байті. Наприклад, коли потрібно зберегти число 248, записуються 3 байта 32 34 38.

Прочитуємо дані

Тепер при спробі прочитати дані з файлів можуть виникнути проблеми при читанні запакованих даних. Що б їх обійти зчитуємо дані так:

Як ви вже могли помітити, функція pack приймає обов'язкових два аргументи: форматну рядок і значення, або кілька значень які необхідно запакувати.

Для того що б оцінити гнучкість запаковування даних давайте спробуємо вирішити таке завдання.

Нам необхідно реалізувати обмін даними між програмами написаними на різних мовах.

Отже, запаковуємо масив містить числа і рядки. Зверніть увагу на те, що якщо для чисел ми знаємо розмір, хоча б припускаємо що число повинне вміститься в тип char, тобто від 0 до 256. Те рядок може містити будь-яку кількість символів.

Для простоти будемо вважати що рядок теж повинна вміститися в 256 символів, тоді ми можемо кількість символів рядка записати в змінну типу char.

Ось так виглядає збережений файл

Спробуємо тепер прочитати файл

І на виході ми отримаємо такий масив:

Як бачите, все просто, навіть найскладніші бінарні структури досить просто розібрати на php.

Схожі статті