איך דחיסה בפורמט ZIP באמת עובדת?
כולנו מכירים את פורמט הדחיסה ZIP.
לדוגמה – יש לנו קובץ APK ששוקל 80MB, ואחרי הדחיסה יוצא קובץ ששוקל רק 42MB.
אבל איך זה אפשרי? איך אפשר "להקטין" את המידע בלי לאבד אותו?
שלב ראשון – הקדמה:
חלק ראשון - מבוא להקדמה
אני ממליץ למי שבאמת רוצה להבין טוב איך עובדת הדחיסה שלא ידלג על ההקדמה, אבל אם מספיק לכם לדעת רק את הרעיון אז תעברו רק על החלק ההראשון שבחלק השני.
יש כמה שיטות לייצוג מידע באמצעות מספרים.
- הבסיס הבינארי (Binary): משתמש רק בספרות 0 ו־1.
- הבסיס ההקסדצימלי (Hexadecimal): משתמש ב־16 ספרות (0־9 ואותיות A־F שבאנגלית).
- הבסיס העשרוני (Decimal): זהו הבסיס הרגיל שבו אנחנו משתמשים ביום־יום, עם הספרות 0–9.
- יש עוד שיטות, אבל הן פחות רלוונטיות לנושא שלנו. אני יודע שזה אולי עדיין לא ברור אבל קצת סבלות אני אסביר הכל.
חלק שני - קוד בינארי
הקוד הבינוארי הוא בעצם השפה שמדבר בה המחשב, הוא לא מכיר את כל השפות האלו כמו פייטון או ג'אווה אלא רק 0 ו 1 (שזה בעצם יש זרם חשמלי או אין).
עכשיו עוד משהו שאנחנו צריכים לדעת על הקוד הבינוארי. כולם מכירים את שיטת הספירה מ 0 עד 9, ואני אסביר למה אני מתכוון.
כל דבר שאתם סופרים מתחיל מ 0 ועולים כל פעם יחידה אחת, מ 0 ל 1 ואז 2 ואז 3 ככה עד 9 וזהו נגמרו לנו כל הסמפרים ולכן אנכנו חוזרים על המספרים שיש לנו שוב אבל הפעם מתחילים מ 1 אבלהסיפרה השנייה תתחיל ה 0 כי מחזקה השנייה לא עברנו על כל המספרים.
עד כאן היה קל נכון? עכשיו הכל אותו דבר בידיוק גם בשפה הבינוארית יש לנו את הספרות 0 ו 1, אנכנו מתחילים לספור מ 0 ועוברים לאחד, וכייון שנגמרו לנו הספרות אנחנו חוזרים שוב על הספרות מחדש אבל הספרה הראשונה תהייה 1 והפרה השנייה תתחיל מ 0 וכו' (יש עוד מה להרכיב אבל לא נצרך לצורך המדריך).
חלק שלישי - קוד הקסדצימלי
עכשיו, מכיוון שזה היה ממש לא נח לדבר עם המחשב על ידי 0 ו 1 לכן אנשים חכמים יצרו את הקוד ה "הקסדצימלי"
אתם מכירים את ה בורר צבעים? תציצו בספויילר .
הינה האתר למי שרוצה.
עכשיו אני הולך להסביר איך הוא עובד.
זוכרים את הבסיס העשרוני? אז הקוד ה הקסדצימלי הוא גם בנוי סדרה של ספרות רק הוא לא נגמר ב 9 אלא ממשיך עם עוד 6 אותיות באנגלית ,A, B, C, D, E, F. והספירה גם כן מתחילה מ 0 אבל מסתיימת לא ב 9אלא באות F.
והקוד של הצבע בנויי מ סדרה של שישה כאלו ספרות, לדוגמה
- FFFFFF = צבע לבן
- 000000 = שחור
- 3827F5 = צבע כחול
אבל כמו שכבר אמרתי ובטח הבנתם הכל תחלס זה 0 ו 1 כי המחשב לא מכיר את כל מספרים ואתיות האלא אז ראו בספויילר טבלה עם המרה מקוד הקסדצימלי לקוד בינוארי .
הקס (Hex) | בינארי (Binary) |
---|---|
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
A | 1010 |
B | 1011 |
דהיינו ספרה אחת מהבסיס הקסדצימלי שווה ל 4 ספרות בבסיס הבינארי
(הסברתי איך נראים הצבעים בקוד כדי בהמשך להסביר איך דוחסים תמונות ולא רק טקסט)
בזמן הכתיבה אני הבנתי שאם אני הולך להסביר מה ההבדלים בין סוגי הדחיסה rar zip 7zip זה היה מאווד ארוך ולא נח לקראיה לכן אני חושב שאני בנושא הזה יסביר את הבסיס ובנושאים חדשים אני אפרט מה ההבדל בין סוגי הדחיסה שזה בעיקרון בצורת האופתימיזציה של השיטה העיקרית.
ואני רוצה גם להוסיף הסבר על דחיסה עם איבוד מידע כגון mp3 png gif וכו' בעזרת ה'
שלב שני – צורת הדחיסה: בעריכה
ניקח טקסט פשוט לדוגמה:
Hello
זהו רצף של 5 תווים.
כל תו מיוצג בזיכרון על ידי מספר (קוד ASCII), וכל קוד כזה תופס 8 ביטים (כלומר byte אחד).
ביחד – המילה Hello שוקלת 40 ביט.
שלב שלישי – איפה נכנסת הדחיסה?
כאן הקסם מתחיל:
מטרת האלגוריתם היא לזהות חזרות מיותרות ולחסוך מקום.
אם יש לנו תו שמופיע הרבה פעמים, לא נכתוב אותו שוב ושוב.
במקום זה, נשתמש בקוד קצר יותר שמייצג אותו.
למשל: נחליט שהאות "l" מיוצגת על ידי ביט אחד בלבד במקום 8 ביטים.
כך, במקום לכתוב "ll" בצורה מלאה (16 ביטים), אנחנו משתמשים בקיצור שמחזיר את אותה התוצאה בפחות מקום.
המחשה
בקיצור – דחיסה לא "זורקת" מידע, אלא משנה את דרך הייצוג כך שייחסכו ביטים.
ככל שהקובץ המקורי חוזר על אותם רצפים שוב ושוב, כך אפשר לחסוך יותר מקום.
נכתב על ידי, ונערך על ידי Ai(חלקית)