dieterm
Legacy Member
Hallo,
Ik heb eens zitten nadenken naar een mogelijke manier om bestanden te comprimeren, en ik heb iets gevonden, dat (op papier toch) werkt.
De methode gaat als volgt:
Ik heb een bestand dat ik omzet naar binair.
bv: een bestand “comprimeermij.txt” met daarin de tekst “Dit is een test”
Omgezet in binair geeft dit :
01000100 01101001 01110100 00100000 01101001 01110011 00100000 01100101 01100101 01101110 00100000 01110100 01100101 01110011 01110100
Nu wil ik het volgende doen:
Ik lees telkens twee bits in en tel hoeveel keer de combinatie 00, de combinatie 01, de combinatie 10 en de combinatie 11 voorkomt.
In mijn voorbeeld:
bits 00: 16
bits 01: 24
bits 10: 12
bits 11: 8
Vervolgens wil ik 2 omzettingstabellen maken, nl één voor de even paren en één voor de oneven paren.
(De reeks bits begint met een even paar, de volgende twee bits is een oneven paar, de twee daaropvolgende bits zijn terug een even paar, enz…)
Voor de Even paren geldt:
De combinatie die het meest voorkomt wordt vervangen door een 1
De combinatie die het 2de meeste voorkomt vervangen door 01
De combinatie die het 3de meeste voorkomt vervangen door 001
De combinatie die het 4de meeste voorkomt vervangen door 000
Dus in mijn voorbeeld zou dat betekenen:
00 > 01
01 > 1
10 > 001
11 > 000
Voor de Oneven paren geldt:
De combinatie die het meest voorkomt wordt vervangen door een 0
De combinatie die het 2de meeste voorkomt vervangen door 10
De combinatie die het 3de meeste voorkomt vervangen door 110
De combinatie die het 4de meeste voorkomt vervangen door 111
Dus in mijn voorbeeld zou dat betekenen:
00 > 10
01 > 0
10 > 110
11 > 111
Als resultaat krijg je dus (E=even, O=oneven):
E O E O E O E O E O E O
Oorspronkelijke data: 01 00 01 00 01 10 10 01 01 11 01 00 ...
Na omzetting: 1 10 1 10 1 110 001 0 1 111 1 10 ...
Na omzetting heb ik dus 3 bits minder, maar om het later opnieuw te kunnen omzetten moet ik nog 6 bits bijtellen om te weten welke de 1ste, 2de en 3de meest voorkomende combinaties waren ( de 4de ken je, als je de eerste 3 kent)
Dus in mijn voorbeeld zou ik nog de bits 01 00 10 moeten bijvoegen.
Als je tot hiertoe nog meebent, dan merk je dat ik na omzetting 21 + 6 = 27 bits nodig heb om iets van 24 bits om te zetten, wat dus groter is dan het oorspronkelijke bestand. Maar ik heb het uitgeprobeerd met de tekst
"Dit is een testDit is een testDit is een testDit is een test" en dan heb ik een compressie van 2.5%" (niet veel ik weet het maar het is al iets
)
Zou iemand mij op weg kunnen helpen om dit te schrijven in C/C++ ?
Ik heb eens zitten nadenken naar een mogelijke manier om bestanden te comprimeren, en ik heb iets gevonden, dat (op papier toch) werkt.
De methode gaat als volgt:
Ik heb een bestand dat ik omzet naar binair.
bv: een bestand “comprimeermij.txt” met daarin de tekst “Dit is een test”
Omgezet in binair geeft dit :
01000100 01101001 01110100 00100000 01101001 01110011 00100000 01100101 01100101 01101110 00100000 01110100 01100101 01110011 01110100
Nu wil ik het volgende doen:
Ik lees telkens twee bits in en tel hoeveel keer de combinatie 00, de combinatie 01, de combinatie 10 en de combinatie 11 voorkomt.
In mijn voorbeeld:
bits 00: 16
bits 01: 24
bits 10: 12
bits 11: 8
Vervolgens wil ik 2 omzettingstabellen maken, nl één voor de even paren en één voor de oneven paren.
(De reeks bits begint met een even paar, de volgende twee bits is een oneven paar, de twee daaropvolgende bits zijn terug een even paar, enz…)
Voor de Even paren geldt:
De combinatie die het meest voorkomt wordt vervangen door een 1
De combinatie die het 2de meeste voorkomt vervangen door 01
De combinatie die het 3de meeste voorkomt vervangen door 001
De combinatie die het 4de meeste voorkomt vervangen door 000
Dus in mijn voorbeeld zou dat betekenen:
00 > 01
01 > 1
10 > 001
11 > 000
Voor de Oneven paren geldt:
De combinatie die het meest voorkomt wordt vervangen door een 0
De combinatie die het 2de meeste voorkomt vervangen door 10
De combinatie die het 3de meeste voorkomt vervangen door 110
De combinatie die het 4de meeste voorkomt vervangen door 111
Dus in mijn voorbeeld zou dat betekenen:
00 > 10
01 > 0
10 > 110
11 > 111
Als resultaat krijg je dus (E=even, O=oneven):
E O E O E O E O E O E O
Oorspronkelijke data: 01 00 01 00 01 10 10 01 01 11 01 00 ...
Na omzetting: 1 10 1 10 1 110 001 0 1 111 1 10 ...
Na omzetting heb ik dus 3 bits minder, maar om het later opnieuw te kunnen omzetten moet ik nog 6 bits bijtellen om te weten welke de 1ste, 2de en 3de meest voorkomende combinaties waren ( de 4de ken je, als je de eerste 3 kent)
Dus in mijn voorbeeld zou ik nog de bits 01 00 10 moeten bijvoegen.
Als je tot hiertoe nog meebent, dan merk je dat ik na omzetting 21 + 6 = 27 bits nodig heb om iets van 24 bits om te zetten, wat dus groter is dan het oorspronkelijke bestand. Maar ik heb het uitgeprobeerd met de tekst
"Dit is een testDit is een testDit is een testDit is een test" en dan heb ik een compressie van 2.5%" (niet veel ik weet het maar het is al iets
)Zou iemand mij op weg kunnen helpen om dit te schrijven in C/C++ ?
.
, maar veel zijde er nie mee he