Skip to main content

איך עובד כיווץ מידע? העולם הזה וכל מה שבו - הכל 0110100101111 • עידו גנדל נכנס לעובי הקורה כדי להסביר לכם איך אפשר לקחת נתונים ולאחסן אותם בפחות מקום

כמעט מדי יום אנחנו שומעים על התקן אחסון חדש, בעל נפח שהיה נחשב לדמיוני לפני שנים ספורות (אם לא חודשים). אך המהפכות האמיתיות בעולם האחסון, אלה שמאפשרות לכל אדם כיום לשמור אלף שירים או אלף תמונות באיכות גבוהה על גבי כרטיס אחד קטן, הושפעו לא פחות דווקא מטכניקות הכיווץ והדחיסה של נתונים, שהיסודות התיאורטיים שלהן נוצרו הרבה לפני עידן הנגנים והמצלמות הדיגיטליות.

מהי המשמעות של דחיסה? איך אפשר בכלל לקחת נתונים ולאחסן אותם בפחות מקום ממה שדרוש להם בצורתם המקורית? במאמר זה נסקור כמה מהעקרונות הבסיסיים של דחיסת

הנתונים ונסלק, בשאיפה, קצת מהערפל שאופף את התחום המרתק הזה.

בעולם המחשבים, היחידה הבסיסית ביותר של נתונים היא הביט (Bit ובעברית "סיבית"), שיכול לקבל את הערכים 0 או 1. כלומר, כדי לאחסן רשימה של אפסים ואחדים (בלי שום דחיסה), נזדקק לכל הפחות למספר זהה של ביטים במחשב. יחידה שימושית יותר היא הבייט (Byte), שאורכו שמונה ביטים והוא מסוגל לאחסן, בייצוג בינארי, מספרים בין 0 ל-255. קוד ASCII, שמוכר כמעט בכל מחשב בעולם, מגדיר רשימה תקנית של תווים ואותיות אנגליות שתואמים למספרים 0-127 (למשל, קוד ASCII של התו "A" הוא 65). לכן, כדי לשמור את המחרוזת "Data" בקוד ASCII נזדקק לארבעה בייטים – אחד ל-"D", אחד ל-"a" וכן הלאה. כמה בייטים צריך כדי לאחסן את המחרוזת "בסיעתא דשמיא"?קודים ותבניות

אלף שירים על כרטיס *כזה* קטן (צ': GettyImages)

אלף שירים על כרטיס *כזה* קטן (צ': GettyImages)

לכאורה, נזדקק ל-12 בייט (כי גם רווח הוא תו). אבל כל ילד יודע שאפשר פשוט לכתוב "בס"ד" ולקבל את אותה משמעות בדיוק בארבעה תווים בלבד. איך הושג החיסכון הזה? הסוד הוא בקיומה של מוסכמה או קוד, כלל ידוע ומקובל על כל דוברי השפה. הביטוי המלא קיים בזכרוננו ביחד עם הקיצור, ולכן דרוש רק הקיצור הכתוב כדי שנבין במה מדובר. אותו הדבר נכון לגבי כל ראשי התיבות בעולם – תנ"ך, רמטכ"ל, NASA וכיו"ב. הבעיה היא שהמחשב לא מכיר את השפה שלנו, והקודים האלה לא מובנים בתוכו. אנחנו צריכים להגדיר לו אותם מראש, או (ואפילו עדיף) לתת לו ליצור אותם בעצמו. ניקח לדוגמה את השיר "לו יהי" המפורסם של נעמי שמר. הפזמון שלו הוא:

לו יהי
לו יהי
אנא לו יהי
כל שנבקש לו יהי

שלושים ושבעה תווים בסך הכל. אבל אם נעביר אותו דרך תוכנה חכמה מספיק, היא תוכל לזהות את המילים החוזרות, ליצור קוד מקומי ולהפיק בעזרתו פזמון מכווץ, כך:

X=לו יהי
X
X
אנא X
כל שנבקש X

לכובע שלו שלוש פינות. ג'ק ספארו (צ' מתוך הסרט 'שודדי הקאריביים')

לכובע שלו שלוש פינות. ג'ק ספארו (צ' מתוך הסרט 'שודדי הקאריביים')

עשרים וחמישה תווים, כשספירה זו כוללת את השורה הראשונה, שאינה חלק מהפזמון אלא מהמידע שמשמש לשחזור של הפזמון המקורי. כעת ניקח שיר אחר, פזמון ילדים ידוע. איך הייתם מכווצים אותו?

לכובע שלי שלוש פינות
שלוש פינות לכובע שלי
לולא היו לו שלוש פינות
לא היה זה הכובע שלי

האינסטינקט הראשוני שלנו הוא ליצור קוד אחד ל"לכובע שלי" וקוד נוסף ל"שלוש פינות", אבל זו טעות. בשורה האחרונה, יש ה' לפני "כובע" ולא ל', כך שלא נוכל שם להשתמש בקוד "לכובע שלי" ונפסיד אפשרות לכיווץ נוסף, שיושג על ידי קוד "כובע שלי" הקצר יותר. וככה זה נראה:

X=כובע שלי
Y=שלוש פינות
לX Y
Y לX
לולא היו לו Y
לא היה זה הX

חמישים וחמישה תווים בלבד (כולל הגדרת הקידוד), לעומת שמונים ואחד במקור – דחיסה של למעלה משלושים אחוזים. ככל שהתוכנה שלנו תהיה חכמה יותר ותוכל לזהות תבניות וקודים חסכוניים יותר, כך הדחיסה שתשיג תהיה טובה יותר.

קידוד אורך חזרהבואו ונסתכל כעת על המשפט הפקאצי הבא:

הלו קיטי שולטתתתתתתתתתתתתתתתתתתתתתתתת!!!!!!!!!1 (אורך: 47 תווים)

אם נתעלם לרגע מסימני הקריאה, יש לנו כאן 24 תווי ת' ברצף. אין שום טעם ליצור קוד לאות ת' הבודדת, כי אורך הקוד יהיה זהה לאורך האות עצמה. מצד שני, אפשר לנסות ולחלק את הרצף לתבניות קטנות יותר. למשל:

X=תתתתתתתתתתתת
הלו קיטי שולטXX!!!!!!!!!1 (39 תווים)

או אולי

X=תתתתתת
הלו קיטי שולטXXXX!!!!!!!!!1 (35 תווים)


בסדר, בסדר, היא שולטתת!!!1 לפטופ של הלו קיטי (צ': יח"צ)

זהו, בערך, הגבול התחתון שאפשר להשיג כאן באמצעות יצירת קוד של רצפי ת'. אבל יש גם שיטה אחרת, שמנצלת את העובדה שכל ה-ת' מופיעות ברציפות בלי שום תו נוסף ביניהן. שיטה זו נקראת RLE – Run Length Encoding (קידוד אורך חזרה), והיא פועלת באמצעות שתילה של תו או קוד קטן ומיוחד בטקסט, שאומר כמה פעמים יש לחזור על האות שאחריו. לדוגמה:

הלו קיטי שולט#24#ת!!!!!!!!!1 (28 תווים בלבד!)

ואם נכווץ את המחרוזת המלאה בשיטה זו, נקבל

הלו קיטי שולט#24#ת#9#!1 (23 תווים – למעלה מ-50% דחיסה)

הבעיה בשיטת RLE היא, כמובן, שהיא טובה רק לנתונים שיש בהם חזרות ארוכות, והיא גם חייבת למצוא קוד ייחודי שאפשר להבדיל בינו לבין שאר הטקסט. בדוגמה שהבאנו, הטקסט המקורי לא כלל את התו "#" ולכן אפשר היה להיעזר בו. הוא לא היה עוזר לנו אם הפקאצה הייתה כותבת, למשל,

הלו קיטי שולטתתתתתתתתתתתתת!!!1 ומי שחושב אחרת הוא &@#$%%**(*%T@#!!!

בפורמט JPG, יחס דחיסה גדול יותר = קובץ קטן יותר = פחות איכות (תמונה ועיבוד: עידו גנדל)

לשמר או לאבד?שתי שיטות הדחיסה שהצגנו עד כה מאפשרות לשחזר את הנתונים המקוריים בצורה מדויקת, אלא שלפעמים אנחנו בכלל לא צריכים את הצורה המדויקת. מה כבר היינו מפסידים אם היינו כותבים את המשפט ההוא פשוט כך: "הלו קיטי שולטת!"? שום דבר מהותי לא היה הולך לאיבוד, והיינו משיגים כמעט 70% דחיסה. דוגמה נוספת: אם המשקל מראה 1500.0013201092 גרם פיסטוק חלבי, למה לא לומר פשוט קילו וחצי?

קיימות שיטות כיווץ מאבדות-מידע, שמאתרות ומנצלות קטעי נתונים שאפשר לוותר עליהם. שיטות כאלה אינן מתאימות לדחיסה של מידע קריטי – למשל תנועות בחשבון בנק, קובצי הפעלה של תוכנות או רשימת אנשי קשר. לעומת זאת, הן שימושיות מאד לשמירה של מולטימדיה – קובצי מוזיקה, תמונות וקטעי וידאו. פורמט jpg הפופולרי לתמונות, לדוגמה, כולל בתוכו שיטת כיווץ מאבדת מידע, ומאפשר לנו לקבוע את מידת הדחיסה הרצויה – במחיר של איכות התמונה, שהופכת פחות ופחות נאמנה למקור ככל שהדחיסה חזקה יותר. לפניכם הדגמה של איבוד מידע בתמונות jpg כפונקציה של יחס הדחיסה.

בכתבה הבאה נדבר על שיקולים סטטיסטיים, נצלול לעומקו של אלגוריתם דחיסה מעניין במיוחד וננסה לגלות כמה רחוק אפשר ללכת עם הרעיון של כיווץ נתונים

Comments

Jabka Atu said…
This comment has been removed by a blog administrator.

Popular posts from this blog

ESP32-C6 Wi-Fi Logger with Browser GPS + Heat Map Dashboard

This project is an ESP-IDF firmware for the Seeed Studio XIAO ESP32-C6 that turns the board into a self-hosted, secure Wi-Fi scanning logger. It creates its own access point, serves a responsive HTTPS web UI, logs nearby Wi-Fi access points, optionally tags rows with GPS coordinates (provided by the client browser), and exposes battery status from the on-board LiPo input. The end result is a pocket Wi-Fi “survey” tool: scan, track, export logs as CSV, and generate a heat map view to visualize RSSI vs location. Project overview and feature set: :contentReference[oaicite:1]{index=1} What it does AP + Station mode so the device can serve the dashboard while scanning nearby Wi-Fi networks. HTTPS web interface using a bundled certificate/key for local secure access. Single scan and continuous tracking modes. CSV export for analysis and archiving. Persistent logging to SPIFFS at /spiffs/logs.csv . Battery monitoring via ADC with voltage/percentage/status sh...

learn how to sniff wireless passwords with pirni

The thing about the iPod Touch and the iPhone is that they are great portable hacking devices. To the naked eye the iPod Touch/iPhone looks like nothing more than an ordinary mp3 player/cellphone however that is just an understatement to its full potential. Once your Ipod Touch/iPhone is jailbroken you have access to your whole file system meaning that applications generally associated with laptop/desktop hacking can be ported and used on the iPod Touch/iPhone. This opens up a whole lot of possibilities for network sniffing, port scanning and much much more! In this tutorial we are going to take a look at one of these programs called Pirni. What is Pirni? Pirni is an application that was ported to The Ipod Touch/iPhone to be used as a native network sniffer. Pirni is so useful because it gets past the iPod Touch’s/iPhone’s wifi hardware limitation of not being able to be set into promiscious mode (a mode that allows a network device to intercept and read each network packet that arrive...

how to run a GUI application throw SSH using X11

soo all we need is first to install the ssh server on the server - machine we like to control so - 1. sudo su 2. apt-get install openssh-server . . now back to our machine using the ssh : 1. ssh -V -X username@the-server-ip 2. enter the password and that is it now we can run any GUI application that install on the server using his CPU cycles yahhhh great !! for example lets run WireShark : 3. gksudo wireshark & now all that if we runing tow Linux machines !! but what windows users that like to run a linux app??! !! soo we need it tow applications 1. putty you can get it here : http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 2.Xming you can get it here : http://sourceforge.net/projects/xming/ ok so first we need to install Xming , and after that we going to use butty but we need to cheak Enable X11 forwarding in connection -- > SSH -- > X11 >> Enable x11 forwarding . and that is it free to run any linux application on windows using SSH . have fun ...