Ймовірно більшість веб-програмістів ніколи не працювали безпосередньо з бінарними даними з php.
І так вийшло не тільки тому, що, найчастіше бінарну обробку беруть на себе різноманітні розширення або бібліотеки. Часто це пов'язано ще і з тим, що інформації в інтернеті не дуже багато, а та що є - складна для сприйняття і далека від потреб конкретного розробника.
Для читання і запису бінарних даних в php є дві корисні функції:
Функція pack запаковує дані в необхідному форматі, за нашою масці, і на виході віддає рядок в бінарному форматі.
Функція unpack виконує зворотне перетворення. Вона на вході очікує рядок в бінарному форматі і на виході віддає масив з даними в звичному нам форматі.
Для розуміння того, як упаковуються дані, потрібно прочитати про те як зберігаються дані в пам'яті. Наприклад з курсу мови програмування C.
Перевага бінарних даних
Припустимо: Нам потрібно записати в файл числа від нуля до 256. Важливо що б файл легко читався програмами на інших мовах і що б за розміром він займав мінімум місця.
записуємо дані
Традиційним способом ми б записували приблизно так:
Запаковивая кожен байт окремо, ми зробили б так:
Тепер порівняємо розміри одержані файлів:
Тобто файл де ми упакували все значення менше в байт, майже в три рази менше ніж файл де ми всі значення записували у вигляді рядка.
Так виглядає файл збережений звичайним способом:
А в цьому файлі значення були упаковані в char:
Уважний розробник відразу помітить причину такого розбухання файлу.
Це звичайно ж символ 0A. використовуваний як роздільник значень (0x0A = 10 = символ нового рядка), і те, що кожен з знаків у змінній зберігається в своєму байті. Наприклад, коли потрібно зберегти число 248, записуються 3 байта 32 34 38.
Прочитуємо дані
Тепер при спробі прочитати дані з файлів можуть виникнути проблеми при читанні запакованих даних. Що б їх обійти зчитуємо дані так:
Як ви вже могли помітити, функція pack приймає обов'язкових два аргументи: форматну рядок і значення, або кілька значень які необхідно запакувати.
Для того що б оцінити гнучкість запаковування даних давайте спробуємо вирішити таке завдання.
Нам необхідно реалізувати обмін даними між програмами написаними на різних мовах.
Отже, запаковуємо масив містить числа і рядки. Зверніть увагу на те, що якщо для чисел ми знаємо розмір, хоча б припускаємо що число повинне вміститься в тип char, тобто від 0 до 256. Те рядок може містити будь-яку кількість символів.
Для простоти будемо вважати що рядок теж повинна вміститися в 256 символів, тоді ми можемо кількість символів рядка записати в змінну типу char.
Ось так виглядає збережений файл
Спробуємо тепер прочитати файл
І на виході ми отримаємо такий масив:
Як бачите, все просто, навіть найскладніші бінарні структури досить просто розібрати на php.