Власне, таких функцій дві - pack () та unpack (). Перша здійснює пакетування даних в двійкову рядок, а друга - розпаковує дані з двійковій рядки. Особисто у мене поки не було необхідності користуватися цими функціями, крім як при підготовці прикладів їх використання для цієї глави. Але хто знає, може бути комусь вони дуже потрібні, тому ми з ними трохи повозитися.
Функція 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 байт;
- @ - заповнення нульовим кодом до заданої абсолютної позиції.
Як вже говорилося вище, Розпаковує дані з двійковій рядки відповідно до формату. Функція повертає масив, що містить розпаковані елементи.
Давайте спробуємо що-небудь запакувати. Наприклад, так.
Отже, що ми побачили: функція повернула 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), і все інше до кінця ми повертаємо як беззнаковое ціле зі старшими розрядами в кінці.