Воскресенье, 27.07.2025, 19:09 Приветствую Вас Гость

On-line: Книги, учебники, статьи

Главная | Регистрация | Вход | RSS

Функции работы с бинарными данными

pack() unpack() 



Собственно, таких функций две – pack() и unpack(). Первая осуществляет пакетирование данных в двоичную строку, а вторая – распаковывает данные из двоичной строки. Лично у меня пока не было необходимости пользоваться этими функциями, кроме как при подготовке примеров их использования для этой главы. Но кто знает, может быть кому-то они очень нужны, поэтому мы с ними чуть-чуть повозимся.

Итак, функция:
pack()

Синтаксис:
string pack(string format [ ,mixed $args, ...])

Функция pack() упаковывает заданные в ее параметре аргументы в бинарную строку. Формат параметров и их количество задается при параметром $format, при помощи тех же спецификаторов форматирования, о которых мы говорили, только без знака %. После каждого спецификатора может стоять число, которое говорит о том, сколько информации будет обработано данным спецификатором. Для форматов a, A, h и H это число задает количество символов, которые будут помещены в бинарную строку из тех, что находятся параметре-строке при вызове функции (то есть, фактически определяется размер поля вывода строки). Если мы используем спецификатор "@", то мы определяем абсолютную позицию, в которую будут помещены данные. Для всех остальных спецификаторов следующие за ними числа задают количество аргументов, на которые распространяется действие данного формата. Вместо числа можно указать *, в этом случае спецификатор действует на все оставшиеся данные. Заметим, что функция возвращает упакованные данные в шестнадцатеричном формате.

Список спецификаторов формата:
a - строка, свободные места в поле заполняются символом с кодом 0; 
A - строка, свободные места заполняются пробелами; 
h - шестнадцатеричная строка, младшие разряды в начале; 
H - шестнадцатеричная строка, старшие разряды в начале; 
c - знаковый байт (символ); 
C - беззнаковый байт; 
s - знаковое короткое целое; 
S - беззнаковое короткое число; 
n - беззнаковое целое (16 битов, старшие разряды в конце); 
v - беззнаковое целое (16 битов, младшие разряды в конце); 
i - знаковое целое (размер и порядок байтов определяется архитектурой); 
I - беззнаковое целое; 
l - знаковое длинное целое (32 бита, порядок знаков определяется архитектурой); 
L - беззнаковое длинное целое; 
N - беззнаковое длинное целое (32 бита, старшие разряды в конце); 
V - беззнаковое целое (32 бита, младшие разряды в конце); 
f - число с плавающей точкой; 
d - число двойной точности; 
x - символ с нулевым кодом; 
X - возврат назад на 1 байт; 
@ - заполнение нулевым кодом до заданной абсолютной позиции. 



Функция
unpack()

Как уже говорилось выше, Распаковывает данные из двоичной строки согласно формату. Функция возвращает массив, содержащий распакованные элементы.

Синтаксис:
array unpack(string $format, string $data)

Давайте попробуем что-нибудь запаковать. К примеру, так.
  $bin = pack("nvn*",0x5722,0x1148, 65, 66); // запаковываем, согласно формату
  $var = bin2hex($bin); // перекодируем из шестнадцатеричного формата
  echo($var);
?>

Итак, что мы увидели: функция вернула 6 байтов, причем в такой последовательности:

0х57, 0х22, 0х48, 0х11, 0х00, 0х41, 0х00, 0х42. Понятно, почему так. Согласно заданному нами формату (nvn*), первое число мы возвращаем как беззнаковое целое со старшими разрядами в конце, второе тоже как беззнаковое целое, только в конце – младшие разряды (поэтому нам вернулось 0х48, 0х11, а не 0х11, 0х48), и все остальное до конца мы возвращаем как беззнаковое целое со старшими разрядами в конце.

















Вход на сайт
Поиск
Календарь
«  Июль 2025  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Архив записей
Наш опрос
Как Вам удобнее??
Всего ответов: 341
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0