В современном мире, наполненном данными в формате XML и JSON, может показаться, что данные с фиксированной длиной вымерли...

что будет роковой ошибкой. Существует большой объем данных, которые используют формат с фиксированной длиной: некоторые журнальные записи, MARC 21 (библиографическая информация), NACHA (финансовая информация), и тому подобное. Поэтому приходится беспокоиться о поддержке работы с таким данными.
Работа с данными в формате с фиксированной длиной относительно просто реализуется в языках программирования, подобных С. Так как после загрузки в память, данные выравниваются в соответствующие структуры. Но в динамических языках программирования, подобных PHP, работа с такими данными превращается в тяжкий труд, результатом которого часто становится появление следующего кода:
01 <?php
02 // Разбор заголовка записи NACHA
03 $row = fread($fp, 94);
04 $header = array();
05 $header["type"] = substr($row, 0, 1);
06 $header["priority"] = substr($row, 1, 2);
07 $header["immDest"] = substr($row, 3, 10);
08 $header["immOrigin"] = substr($row, 13, 10);
09 $header["date"] = substr($row, 23, 6);
10 $header["time"] = substr($row, 29, 4);
11 $header["sequence"] = substr($row, 33, 1);
12 $header["size"] = substr($row, 34, 3);
13 $header["blockFactor"] = substr($row, 37, 2);
14 $header["format"] = substr($row, 39, 1);
15 $header["destName"] = substr($row, 40, 23);
16 $header["originName"] = substr($row, 63, 23);
17 $header["reference"] = substr($row, 86, 8);
18 print_r($header);
Такой код слишком громоздок и уязвим для глупых, трудно выявляемых ошибок индексов. Но ему есть альтернатива: функция unpack().
Описание функции unpack() гласит: “Распаковывает данные из бинарной строки в массив согласно заданному формату” и представляет несколько примеров использования для данных в бинарном формате. Не вполне очевидно, что данная функция может быть использована для работы с данными в формате с фиксированной длиной благодаря коду формата ‘A’, который представляет символ (любая строка является набором битов и байтов).
С помощью функции unpack() выше приведенный пример можно изменить следующим образом:
1 <?php
2 // Разбор заголовка записи NACHA
3 $row = fread($fp, 94);
4 $header = unpack("A1type/A2priority/A10immDest/A10immOrigin/"
5 . "A6date/A4time/A1sequence/A3size/A2blockFactor/A1format/"
6 . "A23destName/A23originName/A8reference", $row);
7 print_r($header);
Строка формата в данном случае является серией кодов A, с указанием количества символов для соответствующего поля, и имени ключа для таблицы результата с разделением через слэш. Например, A6date соответствует 6 символам и будет доступно как $header["date"].
#xml #php #json

Комментарии

Комментариев нет.