Функції роботи з бінарними даними - pack () та unpack ()

Власне, таких функцій дві - 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), і все інше до кінця ми повертаємо як беззнаковое ціле зі старшими розрядами в кінці.

Схожі статті