Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Osm bitů v sedmi
8 v 7
17. března 2003, 00.00 | V tomto článku si ukážeme malý trik jenž můžeme použít nejen při kompresi malých čísel, ale taky při dekódování potažmo enkódování dat (SMS) z a do formátu PDU, jenž se se používá v mobilních telefonech.
Dnes malinko odbočíme od tématu grafické komprese a povíme si něco, co jsem tak trochu načal v předchozím článku, a co se nám může někdy v budoucnu hodit. V minulém článku jsme si ukázali možnosti doplňkové komprese některých koeficientů DCT -matice, menších jak 7 bitů (číslo v desítkové soustavě menší jak 127) pomocí zápisu do sedmibitoveho formátu. Samozřejmě tento způsob je jen nejjednodušší možností, taky je možný ukládat 6 bitová nebo 9 bitová čísla stačí mít na paměti kolik bitů jsme použili pro ten který koeficient čili mít standard. Jedná se o zcela jednoduchý úkon, který je možné udělat mnoha způsoby, třeba přímým přístupem k jednotlivým bitům, ale taky jednoduchým matematickým přepočtem jenž si ukážeme. Využít tohoto triku můžeme nejen při kompresi malých čísel, ale taky při dekódování potažmo enkódování dat(SMS) z a do formátu PDU, jenž se se používá v mobilních telefonech.
Nejdříve koeficienty (dále jen čísla) převedeme do dvojkové - binární soustavy a uložíme do pole nebo do řetězce. Standardní zápis 8 bitů vypadá v dvojkovém formátu nasledovně: číslo 6 = 0x18 + 0x17 + ... + 1x22 + 1x21 + 0x20.
Matematicky se převod do dvojkové soustavy dělá celočíselným dělením vstupu až po nulu. Zbytky po dělení dávají řetězec dvojkového zápisu. Vlevo je všeobecný formát kde červené šipky znázorňují celočíselné dělení modré zbytek ... binární zápis se čte od spodu nahoru. T.j. šestka vpravo je 110. |
Takhle z osmi vstupních čísel získáme sedm, což představuje účinnost komprese přibližně 88%. Chtěl bych zde upozornit, že toto je jen taková doplňková komprese. Všeobecně se používaji víc VLC nebo Huffmanovo kódovaní (pro zajímavost je z roku přibl. 1955), kde se nahrazují nejčastěji se vyskytujíci čísla nejmenšími znaky.
Teď jak na to prakticky:
|
Následujíci funkce ze zadaného 56 prvkového pole bitů vrací pole 7 nebo 8 čísel podle hodnoty outputsize a taky podle něho dělí vstupní pole na 7 nebo 8 prvkové části.
|
Na to abychom kompresi ovšem taky udělali na disku je potřeba získaná čísla zapisovat do souboru v binárním formátu.
Co to je binární formát? Data se obvykle ukládají do paměti ve dvouch formátech textovém a binárním. V textovém se vše ukládá jako text (překvápko že? :-) to jest také čísla. Např. číslo 125 se uloží jako znak "1", znak "2" a znak "5". V binární podobě se uloží jako sekvence bitů 01111101. I když to tak nevypadá ale binární způsob přístupu k datům má také své nevýhody, ale o nich teď mluvit nebudeme. Je ale jasné, že binární způsob zabírá většinou méně místa, je přesnější protože ukládá přesnou vnitřní reprezentaci hodnoty čísel a všeobecně ukladání dat může být rychlejší protože nedochází ke konverzím čísel na znaky.
Tak víme co je binární formát a teď jak s ním pracovat. Úplně stejně jak s textovým až na pár vyjímek. První je, že musíme procesoru říct že chceme číst byty a ne znaky to jest otevřeme soubor v binárním formátu a druhá je že musíme uvést kolik bytů ukládáme :
|
Následujíci funkci berte jenom jako pomůcku, načítá obsah souboru do pole 7 bytů (tedy proměnných char) ..
|
Tak celý zdroják najdete tady(1,2kB) a taky je k dispozici zdroják pro Delphi(4,8kB).
Dodatek: Jestli máte rádi hádanky tady je 7 čísel jenž reprezentují 8 bytových čísel. Každé z osmi čísel pak odpovída znaku v ASCII sadě. Když tedy zjistíte, která čísla to jsou dozvíte se odkaz jenž nesou. :-)
[125, 54, 13, 74, 82, 108, 60]
Zdroje:
http://www.dreamfabric.com/sms/
http://www.learnbinary.com/binary.html
S.Prata - Mistrovství v
C++
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007