Snappy (раніше — Zippy) — бібліотека для швидкого стиснення і розпакування даних, написана на в Google на основі LZ7; відкрита в 2011 році. Основна мета — досягнення високої швидкості стискання, при цьому не прагнули досягти найбільшого стискання чи сумісності з іншими бібліотеками.
Тип | архіватор |
---|---|
Автор | Джефф Дін, [en], Steinar H. Gunderson |
Розробник | |
Стабільний випуск | 1.1.9 (4 травня 2021 ) |
Операційна система | крос-платформовий |
Мова програмування | |
Ліцензія | модифікована ліцензія BSD |
Репозиторій | github.com/google/snappy |
Вебсайт | github.com/google/snappy |
Розповсюджується як бібліотека з обгорткою для С. Існують порти для інших мов програмування, в тому числі для C#, Ліспа, Erlang, Go, Haskell, Haxe, Java, Lua, Node.js, Perl, PHP, Python, R, Ruby, Rust, Smalltalk.
Формат потоку
Інформація в Snappy архівах — масив байтів.
Перші байти в потоці визначають розмір даних до стискання. Розмір зберігається у вигляді (little endian) «varint», тобто ціле число в коді змінної довжини (Variable-length code). Перші сім біт кожного байту використовують для даних, а восьмий біт — ознака кінця даних які описують цей розмір. Максимальний розмір — 2^32 - 1 байт.
Решта байтів потоку закодовані у вигляді одного з чотирьох типів елементу. Тип елементу зазначено в перших двох бітах першого байту (байт тегу — tag byte) елементу.
Позначення: код — посилання на словник; зсув — зсув від поточної позиції на раніше розпаковані данні з потоку; довжина — кількість байтів коду з словника.
00
— не стиснені дані або літерал; решта 6 бітів використовуються для збереження розміру цих даних; якщо розмір більше аніж 60 байтів, наступні 1, 2, 3 або 4 байти використовуються для збереження розміру. Кількість відведених байтів залежить від того наскільки більше від 60 вказано розмір в тег байту — 61, 62, 63 або 64 відповідно. Фактична довжина більша на один байт.01
— код, що зберігає довжину (3 біта) та зсув (11 бітів); один байт після тегу використовують для решти даних бо зсуву. Фактична довжина більша на 4 байти.10
— код, що зберігає довжину (6 біта) та зсув у вигляді двох байтів після. Фактична довжина більша на 1 байт.11
— теж саме що і попередній код, але для зсуву відведено вже 4 байти.
Порядок байтів будь який, проте код не може йти першим позаяк зсуву буде ні на що посилатися, як і зсув не може бути рівним нулю. Розмір в кодах може перевищувати зсув, відповідно як і в RLE кодуванні — інформація при таких обставинах починає братися з початку зсуву і так до моменту коли вся довжина вичерпається.
Приклад потоку
Текст в UTF-8 кодуванні:
Матеріал з Вікіпедії — вільної енциклопедії.
Один із варіантів архівації потоку:
0000000: 53 F0 48 D0 9C D0 B0 D1 | 82 D0 B5 D1 80 D1 96 D0 SpHMња°т‚еµрЂі–а
Перший байт 0x53
— це довжина, вираз у вигляді little-endian varint (див. також Protocol Buffers — для детальної специфікації запису цілого числа змінної довжини або преамбулу в формальному описанні формату — для короткої нотатки), не стисненого потоку в байтах — 8310. Наступний байт, 0xF0
, містить інформацію про тип елементу: 0 згідно перших двох бітах — отже це літерал. Так як він більше аніж 60, згідно інформації в решті 6 бітах, то довжина літералу зазначена в наступному байті 0x48
— 7210, а його фактична буде 72 + 1.
0000010: B0 D0 BB 20 D0 B7 20 D0 | 92 D1 96 D0 BA D1 96 D0 °л» з· В’і–кєі–п 0000020: BF D0 B5 D0 B4 D1 96 D1 | 97 20 E2 80 94 20 D0 B2 їеµдґі–ї— — вІ 0000030: D1 96 D0 BB D1 8C D0 BD | D0 BE D1 97 20 D0 B5 D0 і–л»ьЊнЅоѕї— еµн 0000040: BD D1 86 D0 B8 D0 BA D0 | BB D0 BE D0 15 2C 00 2E Ѕц†иёкєл»оѕР.,..
0x15
— цей байт тегу вказує на тип 1 з довжиною 5 + 4 байт. Інформація щодо зсуву зазначена в наступному байті 0x2C
— 4410. Довжина та зсув вказує на попередньо зчитані UTF-8 дані — "педії". Далі літерал 0x00
з довжиною 0 + 1 байт та байтом 0x2E
що містить дані літералу — ".".
В прикладі повторення з п'яти UTF-8 символів було вилучено в процесі стискання. Більшість інших бібліотек, наприклад як вже класичні — gzip чи bzip2, можуть стиснути цей приклад краще.
Зноски
- . Репозиторій бібліотеки від Google на GitHub (англ.). Архів оригіналу за 16 жовтня 2018. Процитовано 1 січня 2022.
- Avram, Abel (6 квітня 2011). . InfoQ (англ.). Архів оригіналу за 10 жовтня 2021. Процитовано 1 січня 2022.
- Metz, Cade (24 березня 2011). . (англ.). Архів оригіналу за 3 липня 2018. Процитовано 1 січня 2022.
- . Репозиторій бібліотеки від Google на GitHub (англ.). Архів оригіналу за 20 листопада 2021. Процитовано 1 січня 2022.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Snappy ranishe Zippy biblioteka dlya shvidkogo stisnennya i rozpakuvannya danih napisana na C v Google na osnovi LZ7 vidkrita v 2011 roci Osnovna meta dosyagnennya visokoyi shvidkosti stiskannya pri comu ne pragnuli dosyagti najbilshogo stiskannya chi sumisnosti z inshimi bibliotekami snappyTip arhivatorAvtor Dzheff Din en Steinar H GundersonRozrobnik GoogleStabilnij vipusk 1 1 9 4 travnya 2021 3 roki tomu 2021 05 04 Operacijna sistema kros platformovijMova programuvannya C Licenziya modifikovana licenziya BSDRepozitorij github com google snappyVebsajt github com google snappy Rozpovsyudzhuyetsya yak C biblioteka z obgortkoyu dlya S Isnuyut porti dlya inshih mov programuvannya v tomu chisli dlya C Lispa Erlang Go Haskell Haxe Java Lua Node js Perl PHP Python R Ruby Rust Smalltalk Format potokuInformaciya v Snappy arhivah masiv bajtiv Pershi bajti v potoci viznachayut rozmir danih do stiskannya Rozmir zberigayetsya u viglyadi little endian varint tobto cile chislo v kodi zminnoyi dovzhini Variable length code Pershi sim bit kozhnogo bajtu vikoristovuyut dlya danih a vosmij bit oznaka kincya danih yaki opisuyut cej rozmir Maksimalnij rozmir 2 32 1 bajt Reshta bajtiv potoku zakodovani u viglyadi odnogo z chotiroh tipiv elementu Tip elementu zaznacheno v pershih dvoh bitah pershogo bajtu bajt tegu tag byte elementu Poznachennya kod posilannya na slovnik zsuv zsuv vid potochnoyi poziciyi na ranishe rozpakovani danni z potoku dovzhina kilkist bajtiv kodu z slovnika 00 ne stisneni dani abo literal reshta 6 bitiv vikoristovuyutsya dlya zberezhennya rozmiru cih danih yaksho rozmir bilshe anizh 60 bajtiv nastupni 1 2 3 abo 4 bajti vikoristovuyutsya dlya zberezhennya rozmiru Kilkist vidvedenih bajtiv zalezhit vid togo naskilki bilshe vid 60 vkazano rozmir v teg bajtu 61 62 63 abo 64 vidpovidno Faktichna dovzhina bilsha na odin bajt 01 kod sho zberigaye dovzhinu 3 bita ta zsuv 11 bitiv odin bajt pislya tegu vikoristovuyut dlya reshti danih bo zsuvu Faktichna dovzhina bilsha na 4 bajti 10 kod sho zberigaye dovzhinu 6 bita ta zsuv u viglyadi dvoh bajtiv pislya Faktichna dovzhina bilsha na 1 bajt 11 tezh same sho i poperednij kod ale dlya zsuvu vidvedeno vzhe 4 bajti Poryadok bajtiv bud yakij prote kod ne mozhe jti pershim pozayak zsuvu bude ni na sho posilatisya yak i zsuv ne mozhe buti rivnim nulyu Rozmir v kodah mozhe perevishuvati zsuv vidpovidno yak i v RLE koduvanni informaciya pri takih obstavinah pochinaye bratisya z pochatku zsuvu i tak do momentu koli vsya dovzhina vicherpayetsya Priklad potokuTekst v UTF 8 koduvanni Material z Vikipediyi vilnoyi enciklopediyi Odin iz variantiv arhivaciyi potoku 0000000 53 F0 48 D0 9C D0 B0 D1 82 D0 B5 D1 80 D1 96 D0 SpHMњa t eµrЂi a Pershij bajt 0x53 ce dovzhina viraz u viglyadi little endian varint div takozh Protocol Buffers dlya detalnoyi specifikaciyi zapisu cilogo chisla zminnoyi dovzhini abo preambulu v formalnomu opisanni formatu dlya korotkoyi notatki ne stisnenogo potoku v bajtah 8310 Nastupnij bajt 0xF0 mistit informaciyu pro tip elementu 0 zgidno pershih dvoh bitah otzhe ce literal Tak yak vin bilshe anizh 60 zgidno informaciyi v reshti 6 bitah to dovzhina literalu zaznachena v nastupnomu bajti 0x48 7210 a jogo faktichna bude 72 1 0000010 B0 D0 BB 20 D0 B7 20 D0 92 D1 96 D0 BA D1 96 D0 l z V i kyei p 0000020 BF D0 B5 D0 B4 D1 96 D1 97 20 E2 80 94 20 D0 B2 yieµdgi yi vЂ vI 0000030 D1 96 D0 BB D1 8C D0 BD D0 BE D1 97 20 D0 B5 D0 i l ЊnЅoѕyi eµn 0000040 BD D1 86 D0 B8 D0 BA D0 BB D0 BE D0 15 2C 00 2E Ѕc iyokyel oѕR 0x15 cej bajt tegu vkazuye na tip 1 z dovzhinoyu 5 4 bajt Informaciya shodo zsuvu zaznachena v nastupnomu bajti 0x2C 4410 Dovzhina ta zsuv vkazuye na poperedno zchitani UTF 8 dani pediyi Dali literal 0x00 z dovzhinoyu 0 1 bajt ta bajtom 0x2E sho mistit dani literalu V prikladi povtorennya z p yati UTF 8 simvoliv bulo vilucheno v procesi stiskannya Bilshist inshih bibliotek napriklad yak vzhe klasichni gzip chi bzip2 mozhut stisnuti cej priklad krashe Znoski Repozitorij biblioteki vid Google na GitHub angl Arhiv originalu za 16 zhovtnya 2018 Procitovano 1 sichnya 2022 Avram Abel 6 kvitnya 2011 InfoQ angl Arhiv originalu za 10 zhovtnya 2021 Procitovano 1 sichnya 2022 Metz Cade 24 bereznya 2011 angl Arhiv originalu za 3 lipnya 2018 Procitovano 1 sichnya 2022 Repozitorij biblioteki vid Google na GitHub angl Arhiv originalu za 20 listopada 2021 Procitovano 1 sichnya 2022