Хранение двоичных данных в строках

Задача
Необходимо проанализировать строку, которая содержит значения, закодированные с помощью двоичной структуры, или закодировать значения в строку. Например, нужно сохранить числа в их двоичном представлении, а не как последовательность ASCII-символов.

Решение
Для сохранения двоичных данных в строке применяется функция pack():

$packed = pack('S4',1974,106,28225,32725);

Функция unpack() позволяет извлекать двоичные данные из строки:

$nums = unpack('S4',$packed);

Обсуждение
Первым аргументом функции pack() является строка формата, который описывает способ кодировки данных, передаваемых остальными аргументами. Строка формата S4 указывает, что функция pack() должна сформировать из входных данных четыре беззнаковых коротких целых (short) 16-битных числа в соответствии с машинным порядком
байтов. В качестве входа даны числа 1974, 106, 28225 и 32725, а возвращаются восемь байт: 182, 7, 106, 0, 65, 110, 213 и 127. Каждая двухбайтная пара соответствует входному числу: 7 × 256 + 182 = 1974; 0 × 256 + 106 = 106; 110 × 256 + 65 = 28225; 127 × 256 + 213 = 32725.


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

print_r($nums);
Array
(
[1] => 1974
[2] => 106
[3] => 28225
[4] => 32725
)

В функции unpack() за символом форматирования и его множителем может следовать строка, которая выступает в качестве индекса массива. Например:

$nums = unpack('S4num',$packed);
print_r($nums);
Array
(
[num1] => 1974
[num2] => 106
[num3] => 28225
[num4] => 32725
)

В функции unpack() несколько символов форматирования должны разделяться символом /:

$nums = unpack('S1a/S1b/S1c/S1d',$packed);
print_r($nums);
Array
(
[a] => 1974
[b] => 106
[c] => 28225
[d] => 32725
)

В табл. 1.2 приведены символы форматирования, которые можно использовать в функциях pack() и unpack().

Таблица 1.2.


Символы форматирования функций pack() и unpack()

Символ форматирования | Тип данных
a Строка, дополненная символами NUL
A Строка, дополненная пробелами
h Шестнадцатеричная строка, первый полубайт младший
H Шестнадцатеричная строка, первый полубайт старший
c signed char
C unsigned char
s signed short (16 бит, машинный порядок байтов)
S unsigned short (16 бит, машинный порядок байтов)
n unsigned short (16 бит, обратный порядок байтов)
v unsigned short (16 бит, прямой порядок байтов)
i signed int (машинно-зависимый размер и порядок байтов)
I unsigned int (машинно-зависимый размер и порядок байтов)
l signed long (32 бита, машинный порядок байтов)
L unsigned long (32 бита, машинный порядок байтов)
N unsigned long (32 бита, обратный порядок байтов)
V unsigned long (32 бита, прямой порядок байтов)
f float (машинно-зависимый размер и представление)
d double (машинно-зависимый размер и представление)
x NUL-байт
X Возврат на один байт
@ Заполнение нулями по абсолютному адресу

Для a, A, h и H число после символа форматирования означает длину строки.


Например, A25 означает строку из 25 символов, дополненную пробелами. В случае других символов форматирования это число означает количество данных указанного типа, последовательно появляющихся в строке. Остальные возможные данные можно указать при помощи символа «*».
С помощью функции unpack() можно преобразовывать различные типы данных. Этот пример заполняет массив ASCII-кодами каждого символа, находящегося в $s:

$s = 'platypus';
$ascii = unpack('c*',$s);
print_r($ascii);
Array
(
[1] => 112
[2] => 108
[3] => 97
[4] => 116
[5] => 121
[6] => 112
[7] => 117
[8] => 115
)

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Анализ данных, разделенных запятой
Анализ данных, состоящих из полей фиксированной ширины
Включение функций и выражений в строки
Доступ к подстрокам
Замещение подстрок

Вернуться в раздел: PHP / 1. Строки