Опис формату даних, що зберігаються
Зауважте, що тут ми використовуємо саме беззнакову змінну - це важливо, тому що значення, що зберігається в BlockInfo може бути більше ніж 128 - максимальне значення для змінної типу CHAR.
Для того, щоб дізнатися що за інформація лежить тут, вам потрібно перевірити стан першого біта в змінної BlockInfo
Чому саме 128? Подивимося на її двійкового коду
Як бачите, на початку варто одиниця, а при операції «І» будь-нуль перекриває одиницю, а одиниця з одиницею дасть одиницю,
так що якщо стан BlockInfo було приміром
Те після операції І в змінно WhatItIs буде ось що
Тобто, видно, що ми отримаємо стан першого біта
А якщо BlockInfo дорівнювало
Те після операції І в змінної WhatItIs було б
Тобто, в першому бите вже не 1 а 0 :))
Так ось, продовжимо.
Після того, як перевіримо що за стан у нас має перший біт, ми зможемо дізнатися інформацію про те, які дані нам дано:
Якщо стан першого біта одно едініце- то це запаковані дані
Якщо стан першого біта дорівнює нулю - то це незапакованние дані
ПРИКЛАД:
У першому блоці дужок запаковані дані, у другому блоці дужок незапакованние.
Поки ми розібралися лише з першим бітом, а в одній байте їх 8, але тому що один вже використаний, то нам залишаються тільки 7. Що ж з ними робити? І для чого вони потрібні і як дізнатися їх стан всіх відразу?
У решти 7 бітах зберігається кількість пікселів-1 які йдуть після читання нашої однобайтового змінної. Далі все поясню.
Для того щоб дізнатися яке число зберігається в цих 7 бітах ми виконаємо все те, що робили на початку, тільки замість
У десятковій системі це число дорівнює 127-ми. Таким чином, щоб дізнатися кількість пікселів, потрібно зробити наступні дії:
NumPixels = BlockInfo 127
Тепер ми знаємо як зберігаються наші дані і скільки їх потрібно обробити, подивимося що вийшло:
Отже, почнемо обговорювати запакували дані і НЕ запаковані.
Після того першого байта йде інформація про єдино пікселі і тут потрібно знати скільки біт йде на піксель
Якщо у нас на піксель йде 24 біта, то нам потрібно прочитати 3 байта (24/8 = 3), а якщо 32 біта то 4 байта
Після того, як ми прочитаємо ці 24 або 32 біта потрібно просто-напросто вкласти в наш масив пікселів стільки однакових пікселів, скільки їх записано в змінної NumPixels
Ви можете запитати, чому ми додали одиницю до змінної - це зроблено тому, що при вилученні кількості пікселів, значення яке ми отримаємо завжди менше на одиницю, це зроблено через те, що у нас залишилося тільки 7 біт, було б 8 ми б нічого не додавали.
2. Незапакованние дані
При незапакованних даних інформація зберігається про кожному пікселі послідовно, тобто, якщо у змінній NumPixels було б значення 20, то нам потрібно було б прочитати 20 пікселів. Тобто, просто читаєте інформацію про пікселі і все.
Як бачите все дуже легко і просто.
ОСЬ ПОВНИЙ ПРИКЛАД: