Konverze formátů při přenosu

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Kódování textů s diakritikou: Vytvořen text.)
(Little × Big Endian: Opravena číselná hodnota v desítkové soustavě - neodpovídala dvojkovému a šestnáctkovému zápisu + nevím, jestli procesory Intel používají little endian kvůli sčítání - odstraňuji slovo "proto".)
 
(Není zobrazeno 6 mezilehlých verzí od 1 uživatele.)
Řádka 1: Řádka 1:
 
[[Category:VSE]][[Category:Sítě]][[Category:Informatika]][[Category:Prezentační vrstva]]
 
[[Category:VSE]][[Category:Sítě]][[Category:Informatika]][[Category:Prezentační vrstva]]
  
== Konverze formátů ==
+
== Co je „konverze formátů“? ==
Jedním z úkolů prezentační vrstvy je převádět formát zápisu (způsob kódování) složitějších datových struktur. Může se jednat o čísla delší než 1 byte, ale také o obrázky a další datové struktury.
+
Jedním z úkolů prezentační vrstvy je převádět formát zápisu (způsob kódování) složitějších datových struktur při přenosu mezi dvěma počítači. Může se jednat o čísla delší než 1 byte, ale také o obrázky a další datové struktury.
  
 
Pokud komunikující počítače používají odlišnou reprezentaci těchto dat, je třeba data při přenosu zkonvertovat.
 
Pokud komunikující počítače používají odlišnou reprezentaci těchto dat, je třeba data při přenosu zkonvertovat.
Řádka 8: Řádka 8:
 
* Reálně používaný model TCP/IP prezentační vrstvu nemá, konverzi si musí provést aplikace sama.
 
* Reálně používaný model TCP/IP prezentační vrstvu nemá, konverzi si musí provést aplikace sama.
  
 +
<div class="Priklad">
 +
; Příklad &ndash; desetinná čísla
 +
Jako příklad uveďme desetinná čísla. Pokud chceme desetinné číslo uložit v&nbsp;počítači, musíme ho převést na posloupnost nul a jedniček. Existují různé způsoby, jak toto provést. Pokud v&nbsp;síti komunikují dva počítače a&nbsp;každý z&nbsp;nich používá jiný způsob, nemohou prostě poslat odpovídající posloupnost bitů přes síť, protože na druhém počítači by stejná posloupnost znamenala jiné číslo. Je třeba provést konverzi.
  
== Kódování textů ==
+
; Představme si následující situaci
 +
Odesílatel a příjemce ukládají desetinná čísla tak, že číslo <code>0,083</code> převedou na <code>83*10<sup>-3</sup></code>. Číslu <code>83</code> se říká ''mantisa'' a <code>-3</code> je ''exponent''.
 +
 
 +
Odesilatel i&nbsp;příjemce použijí&nbsp;16 bitů. Dále ale postupují různě:
 +
* Odesilatel:
 +
*# mantisu (číslo <code>83</code>) ukládá na 8&nbsp;bitů: <code>0101 0011</code>
 +
*# posléze využije další byte tak, že 1.&nbsp;bit bude reprezentovat znaménko (0..plus, 1..mínus) a dalších 7 bitů exponent <code>3</code>: <code>1</code> <code>000 0011</code>
 +
*: <code>0,083</code> => číslo <code>83</code>: <code>0101 0011</code> + znaménko: <code>1</code> (mínus) + exponent <code>3</code>: <code>000 0011</code> => <code>0101 0011 1000 0011</code>
 +
* Příjemce reprezentuje desetinná čísla jinak. Číslo <code>0,083</code> uloží tak, že:
 +
*# nejprve uvede znaménko exponentu (1 bit): <code>1</code> (mínus)
 +
*# poté exponent na 3 bity (to obvykle stačí): <code>011</code>
 +
*# a posléze využije 12 bitů na zápis mantisy (číselné části).
 +
*: <code>0,083</code> => znaménko: <code>1</code> (mínus) + exponent <code>3</code>: <code>011</code> + číslo <code>83</code>: <code>0000 0101 0011</code> => <code>1011 0000 0101 0011</code>)
 +
 
 +
Pokud by odesilatel prostě vzal 16 bitů, které reprezentují číslo a poslal je příjemci, ten by místo čísla <code>0,083</code> přečetl:
 +
*: <code>0101 0011 1000 0011</code> => znaménko: <code>0</code> (plus) + exponent <code>5</code>: <code>101</code> + číslo <code>899</code>: <code>0011 1000 0011</code> => <code>899*10<sup>5</sup></code> => <code>89&nbsp;900&nbsp;000</code>
 +
 
 +
Aby se nedorozumění předešlo, musí buď odesilatel nebo příjemce data převést do formátu, který používá příjemce. To označujeme jako provedení konverze.
 +
</div>
 +
 
 +
 
 +
== Další běžné konverze dat ==
 +
V&nbsp;dnešních sítích se naprosto běžně setkáme s následujícími variantami konverze dat:
 +
* Převod různých způsobů kódování textů (národní abecedy)
 +
* Převod různých formátů pro ukládání obrázků
 +
* Převod různého způsobu zápisu delších čísel (Little a Big Endian)
 +
 
 +
 
 +
=== Kódování textů ===
 
* Veškerá data jsou v&nbsp;počítači ukládána a přenášena jako posloupnosti 0 a 1.
 
* Veškerá data jsou v&nbsp;počítači ukládána a přenášena jako posloupnosti 0 a 1.
 
* Pro ukládání a&nbsp;přenášení textů je tedy nutno texty převést (zakódovat) na čísla.
 
* Pro ukládání a&nbsp;přenášení textů je tedy nutno texty převést (zakódovat) na čísla.
  
=== ASCII a další ===
+
; ASCII, UTF-8 a kódové stránky
* Běžně se používá pro ukládání znaků kódování ASCII, které převádí každý písmeno na jeho 8bitový kód. (Viz třeba [https://cs.wikipedia.org/wiki/ASCII Wikipedia.org &rarr; ASCII].)
+
* Pro kódování textů (ukládání textů v&nbsp;paměti počítače ve tvaru posloupností byte) se dnes běžně používá kódování ASCII či z&nbsp;něj odvozená kódování UTF-8 či (výjimečně) UTF-16.
* Existují však i další kódování: UTF-8, UTF-16, nebo třeba EBCDIC.
+
* Problém s&nbsp;ASCII je v tom, že znaky ukládá na 8&nbsp;bitů.
 +
* 8&nbsp;bitů ale umožňuje pouze 256&nbsp;různých kombinací, což sice dostačuje pro základní latinskou abecedu, ale neumožňuje ukládat rozšířené národní abecedy (azbuka, české znaky s&nbsp;diakritikou, čínská abeceda,...)
  
=== ASCII a kódové stránky ===
+
* Rozšířené národní abecedy (například znaky s&nbsp;diakritikou v&nbsp;češtině a&nbsp;dalších jazycích) používají různé tzv.&nbsp;„kódové stránky“, které přiřazují znakům ze 2.&nbsp;poloviny ASCII tabulky speciální významy.
* I u samotného ASCII ovšem dochází k nutnosti konverze.
+
* Problém je v tom, že 8&nbsp;bitů umožňuje pouze 256&nbsp;různých kombinací, což sice dostačuje pro základní latinskou abecedu, ale neumožňuje ukládat rozšířené národní abecedy (azbuka, znaky s diakritikou, čínská abeceda,...)
+
 
+
* Rozšířené národní abecedy (například znaky s diakritikou v češtině a dalších jazycích) používají různé tzv. „kódové stránky“, které přiřazují znakům ze 2.&nbsp;poloviny ASCII tabulky speciální významy.
+
 
* Například pro češtinu se běžně používají kódové stránky:
 
* Například pro češtinu se běžně používají kódové stránky:
 
*# Windows-1250 (kódová stránka 1250)... navržena a používána Microsoftem v&nbsp;grafickém prostředí Windows
 
*# Windows-1250 (kódová stránka 1250)... navržena a používána Microsoftem v&nbsp;grafickém prostředí Windows
Řádka 27: Řádka 55:
 
*# ISO-8859-2... standard organizace ISO. Používán běžně většinou ostatních operačních systémů.
 
*# ISO-8859-2... standard organizace ISO. Používán běžně většinou ostatních operačních systémů.
  
* Vzhledem k problémům s detekcí kódových stránek se dnes kódování ASCII postupně nahrazuje univerzálním kódováním [https://cs.wikipedia.org/wiki/UTF-8 UTF-8], které je s&nbsp;ASCII částečně kompatibilní (reprezentace prvních 128 znaků ASCII je stejná).  
+
* Pokud tvůrce webové stránky vytvoří web s&nbsp;kódováním Windows-1250 a&nbsp;čtenář používá Linux, některé české znaky se čtenáři nezobrazí správně. A&nbsp;samozřejmě podobně naopak.
* Například ve většině linuxových distribucí je již UTF-8 standardem. Stejně tak je doporučenou volbou pro psaní webových stránek.
+
  
 
<div class="Poznamka">
 
<div class="Poznamka">
Pokud komunikují počítače, které používají odlišné způsoby kódování znaků, je třeba je převádět (konvertovat).  
+
Pokud komunikují počítače, které používají odlišné způsoby kódování znaků, je třeba je převádět (konvertovat). Dnes se to řeší tak, že prohlížeče běžně znají všechny běžně používané způsoby kódování a tvůrce stránky do kódu HTML zapíše, jaký způsob kódování používá (viz HTML element <code>&lt;meta charset="windows-1250" /&gt;</code>).
 +
</div>
  
Typickým příkladem takové konverze je převod mezi kódovými stránkami ASCII v prohlížečích.
+
* Vzhledem k problémům s&nbsp;detekcí a&nbsp;konverzemi kódových stránek se dnes kódování ASCII postupně nahrazuje univerzálním kódováním [https://cs.wikipedia.org/wiki/UTF-8 UTF-8], které je s&nbsp;ASCII částečně kompatibilní (reprezentace prvních 128 znaků ASCII je stejná).  
</div>
+
* Například ve většině linuxových distribucí je již UTF-8 standardem. Stejně tak je doporučenou volbou pro psaní webových stránek.
  
== Little × Big Endian ==
+
; ASCII &times; EBCDIC apod.
 +
* V&nbsp;době vzniku architektury ISO/OSI byla situace složitější v&nbsp;tom, že se běžně používaly pro ukládání znaků i&nbsp;zcela odlišné způsoby kódování znaků. Kromě ASCII třeba kód EBCDIC na sálových počítačích IBM v&nbps;70. letech.
  
 +
=== Obrázky ===
 +
* Z&nbsp;grafiky samozřejmě víte, že existují různé formáty obrázků.
 +
* Dnešní sítě se s&nbsp;problémem převodu obrázků vyrovnaly tak, že existuje skupina „běžně podporovaných“ formátů (PNG, JPG, GIF,...) a&nbsp;jiné formáty se v&nbsp;sítích běžně nepoužívají.
 +
* Pokud by byl ale model ISO/OSI implementován běžně v&nbsp;počítačích, byl by převod formátů obrázků starostí síťového rozhraní. Například prohlížeč by si řekl, v&nbsp;jakém formátu obrázky umí zobrazit, a&nbsp;prezentační vrstva by měla za úkol obrázky převést. (Asi by s&nbsp;tím bylo dost těžkostí, ale to ponechme stranou.)
  
== Obrázky ==
+
=== Little × Big Endian ===
 +
* K&nbsp;problémům s&nbsp;konverzí dat ale dochází i&nbsp;v&nbsp;mnohem jednodušších situacích.
 +
* Představme si, že chceme přes síť přenést 32bitové číslo. Například číslo <code>1158</code> &rarr; <code>00000000 00000000 00000100 10000110</code> binárně resp. <code>00 00 04 86</code> hexadecimálně.
  
 +
; Big Endian
 +
* Jsme zvyklí v&nbsp;číslech zapisovat nejprve nejvýznamnější číslice: číslo <code>1158</code> píšeme jako <code>1&rarr;1&rarr;5&rarr;8</code>, nikoli jako: <code>8&rarr;5&rarr;1&rarr;1</code>
 +
* Proto nám připadá logické, že uložíme číslo <code>1158</code> do paměti počítače takto:
 +
{| class="wikitable"
 +
! Adresa v paměti !! Hodnota
 +
|-
 +
| 1 || 0000 0000 (00 hex)
 +
|-
 +
| 2 || 0000 0000 (00 hex)
 +
|-
 +
| 3 || 0000 0100 (04 hex)
 +
|-
 +
| 4 || 1000 0110 (86 hex)
 +
|-
 +
|}
 +
* Tento způsob zápisu se označuje jako ''Big Endian''.
 +
* Big Endian:
 +
** Je snáze čitelný pro lidi (například při sledování obsahu datagramů,...)
 +
** Používá se v&nbsp;hlavičkách síťových protokolů.
 +
 +
; Little Endian
 +
* Na druhou stranu například pro matematické operace s&nbsp;dvojkovými čísly je praktičtější, když jsou čísla uložena v&nbsp;opačném pořadí. Například pokud čísla sčítáme, bereme nejprve součet nejméně významných číslic.
 +
<div class="Priklad">
 +
Například když sčítáme <code>1158+507</code>, budeme nejprve potřebovat zjistit součet  <code>8+8</code>, pak budeme sčítat <code>5+0+1</code> atd. (Potřebujeme tak postupovat kvůli přenosu z&nbsp;nižších řádů.)
 +
</div>
 +
* Například procesory Intel v&nbsp;paměti používají zápis, označovaný jako ''Little Endian'':
 +
{| class="wikitable"
 +
! Adresa v paměti !! Hodnota
 +
|-
 +
| 1 || 1000 0110 (86 hex)
 +
|-
 +
| 2 || 0000 0100 (04 hex)
 +
|-
 +
| 3 || 0000 0000 (00 hex)
 +
|-
 +
| 4 || 0000 0000 (00 hex)
 +
|-
 +
|}
 +
* Při zápisu Little Endian jsou v&nbsp;paměti nejprve méně významné byte a&nbsp;až poté ty významnější (nejprve „jednotky“, pak „desítky“, pak „stovky“,... tedy, pokud to takto můžeme označit při zápisu ve dvojkové soustavě po bytech).
 +
* Little Endian
 +
** Je o&nbsp;něco praktičtější při matematických operacích s&nbsp;čísly.
 +
** Používají jej procesory architektury Intel x86 a&nbsp;kompatibilní (tedy samozřejmě i&nbsp;AMD a&nbsp;obecně dnes většina procesorů stolních počítačů.)
 +
 +
; Je lepší Little nebo Big Endian?
 +
* To je asi zcela zbytečná otázka. V&nbsp;dnešním světě se používá obojí a&nbsp;ještě dlouho nejspíš bude.
 +
* Každopádně je důležité vědět:
 +
** co toto označení znamená,
 +
** že při přenosu dat mezi zařízeními je třeba řešit, zda není potřeba data převést z&nbsp;jednoho způsobu ukládání na druhý,
 +
** při programování nástrojů pro sítě a&nbsp;obecně komunikaci řešit, zda se používá Little nebo Big Endian.
 +
 +
<div class="Poznamka">
 +
; Odkud se vzalo označení „Little/Big Endian“?
 +
* V&nbsp;knize Jonathana Swifta [https://www.databazeknih.cz/knihy/gulliverovy-cesty-35047 Gulliverovy cesty (Gulliver's Travels, 1726)] se objevují dva národy trpaslíků, které mezi sebou vedou letitou a&nbsp;krvavou válku o&nbsp;to, zda je správné vařené vejce rozbíjet na širším či užším konci (little × big end).
 +
 +
* Autor knihy tím mimo jiné nejspíš poukazoval na nesmyslnost válek mezi katolíky a&nbsp;protestanty, které zmítaly Evropou většinu raného novověku a&nbsp;hlavním „tématem sporu“ bylo, zda věřící při přijímání mohou s&nbsp;knězem pít mešní víno, nebo smí pozřít pouze hostie (reprezentující krev a&nbsp;tělo Krista).
 +
* Samozřejmě z&nbsp;dějepisu víte, že ve skutečnosti šlo spíše o&nbsp;to, zda má církev shromaždovat majetek a politický vliv, či zda se má starat pouze o&nbsp;duše věřících.
 +
</div>
  
 
== ASN.1 ==
 
== ASN.1 ==
 +
* Pokud bychom chtěli implementovat plně model ISO/OSI, museli bychom se vyrovnat s&nbsp;existencí velkého množství různých formátů dat.
 +
* V&nbsp;80. letech proto vznikla myšlenka, že by bylo jednodušší navrhnout univerzální, všemi podporovaný formát dat. Pak by stačilo, aby každý počítač uměl převádět data do tohoto univerzálního formátu a&nbsp;zpět.
 +
* Takovým formátem měl být formát ASN.1.
 +
* My ale víme, že svět sítí se nakonec vydal jinou cestou &rarr; využitím jednoduššího modelu TCP/IP a&nbsp;přenecháním starostí s&nbsp;převodem formátů na tvůrce jednotlivých aplikací.
  
  
 
== Zdroje ==
 
== Zdroje ==
 
* PETERKA, Jiří. ''Prezentační vrstva.'' eArchiv.cz [online]. 1996 [cit. 2017-06-26]. Dostupné z: [http://www.earchiv.cz/a92/a226c110.php3 http://www.earchiv.cz/a92/a226c110.php3]
 
* PETERKA, Jiří. ''Prezentační vrstva.'' eArchiv.cz [online]. 1996 [cit. 2017-06-26]. Dostupné z: [http://www.earchiv.cz/a92/a226c110.php3 http://www.earchiv.cz/a92/a226c110.php3]
* ''ASCII.'' In: Wikipedia: the free encyclopedia [online]. San Francisco (CA): Wikimedia Foundation, 2016 [cit. 2017-06-26]. Dostupné z: [https://cs.wikipedia.org/wiki/ASCII https://cs.wikipedia.org/wiki/ASCII]
+
* ASCII. In: ''Wikipedia: the free encyclopedia [online].'' San Francisco (CA): Wikimedia Foundation, 2016 [cit. 2017-06-26]. Dostupné z: [https://cs.wikipedia.org/wiki/ASCII https://cs.wikipedia.org/wiki/ASCII]
 +
* UTF-8. In: ''Wikipedia: the free encyclopedia [online].'' San Francisco (CA): Wikimedia Foundation, 2016 [cit. 2017-06-26]. Dostupné z: [https://cs.wikipedia.org/wiki/UTF-8 https://cs.wikipedia.org/wiki/UTF-8]
 +
* Abstract Syntax Notation One. In: ''Wikipedia: the free encyclopedia [online].'' San Francisco (CA): Wikimedia Foundation, 2016 [cit. 2020-03-16].[https://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One https://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One]

Aktuální verze z 22. 4. 2024, 07:09


Obsah

Co je „konverze formátů“?

Jedním z úkolů prezentační vrstvy je převádět formát zápisu (způsob kódování) složitějších datových struktur při přenosu mezi dvěma počítači. Může se jednat o čísla delší než 1 byte, ale také o obrázky a další datové struktury.

Pokud komunikující počítače používají odlišnou reprezentaci těchto dat, je třeba data při přenosu zkonvertovat.

Příklad – desetinná čísla

Jako příklad uveďme desetinná čísla. Pokud chceme desetinné číslo uložit v počítači, musíme ho převést na posloupnost nul a jedniček. Existují různé způsoby, jak toto provést. Pokud v síti komunikují dva počítače a každý z nich používá jiný způsob, nemohou prostě poslat odpovídající posloupnost bitů přes síť, protože na druhém počítači by stejná posloupnost znamenala jiné číslo. Je třeba provést konverzi.

Představme si následující situaci

Odesílatel a příjemce ukládají desetinná čísla tak, že číslo 0,083 převedou na 83*10-3. Číslu 83 se říká mantisa a -3 je exponent.

Odesilatel i příjemce použijí 16 bitů. Dále ale postupují různě:

  • Odesilatel:
    1. mantisu (číslo 83) ukládá na 8 bitů: 0101 0011
    2. posléze využije další byte tak, že 1. bit bude reprezentovat znaménko (0..plus, 1..mínus) a dalších 7 bitů exponent 3: 1 000 0011
    0,083 => číslo 83: 0101 0011 + znaménko: 1 (mínus) + exponent 3: 000 0011 => 0101 0011 1000 0011
  • Příjemce reprezentuje desetinná čísla jinak. Číslo 0,083 uloží tak, že:
    1. nejprve uvede znaménko exponentu (1 bit): 1 (mínus)
    2. poté exponent na 3 bity (to obvykle stačí): 011
    3. a posléze využije 12 bitů na zápis mantisy (číselné části).
    0,083 => znaménko: 1 (mínus) + exponent 3: 011 + číslo 83: 0000 0101 0011 => 1011 0000 0101 0011)

Pokud by odesilatel prostě vzal 16 bitů, které reprezentují číslo a poslal je příjemci, ten by místo čísla 0,083 přečetl:

  • 0101 0011 1000 0011 => znaménko: 0 (plus) + exponent 5: 101 + číslo 899: 0011 1000 0011 => 899*105 => 89 900 000

Aby se nedorozumění předešlo, musí buď odesilatel nebo příjemce data převést do formátu, který používá příjemce. To označujeme jako provedení konverze.


Další běžné konverze dat

V dnešních sítích se naprosto běžně setkáme s následujícími variantami konverze dat:


Kódování textů

ASCII, UTF-8 a kódové stránky

Pokud komunikují počítače, které používají odlišné způsoby kódování znaků, je třeba je převádět (konvertovat). Dnes se to řeší tak, že prohlížeče běžně znají všechny běžně používané způsoby kódování a tvůrce stránky do kódu HTML zapíše, jaký způsob kódování používá (viz HTML element <meta charset="windows-1250" />).

ASCII × EBCDIC apod.

Obrázky

Little × Big Endian

Big Endian
Adresa v paměti Hodnota
1 0000 0000 (00 hex)
2 0000 0000 (00 hex)
3 0000 0100 (04 hex)
4 1000 0110 (86 hex)
Little Endian

Například když sčítáme 1158+507, budeme nejprve potřebovat zjistit součet 8+8, pak budeme sčítat 5+0+1 atd. (Potřebujeme tak postupovat kvůli přenosu z nižších řádů.)

Adresa v paměti Hodnota
1 1000 0110 (86 hex)
2 0000 0100 (04 hex)
3 0000 0000 (00 hex)
4 0000 0000 (00 hex)
Je lepší Little nebo Big Endian?
Odkud se vzalo označení „Little/Big Endian“?
  • V knize Jonathana Swifta Gulliverovy cesty (Gulliver's Travels, 1726) se objevují dva národy trpaslíků, které mezi sebou vedou letitou a krvavou válku o to, zda je správné vařené vejce rozbíjet na širším či užším konci (little × big end).
  • Autor knihy tím mimo jiné nejspíš poukazoval na nesmyslnost válek mezi katolíky a protestanty, které zmítaly Evropou většinu raného novověku a hlavním „tématem sporu“ bylo, zda věřící při přijímání mohou s knězem pít mešní víno, nebo smí pozřít pouze hostie (reprezentující krev a tělo Krista).
  • Samozřejmě z dějepisu víte, že ve skutečnosti šlo spíše o to, zda má církev shromaždovat majetek a politický vliv, či zda se má starat pouze o duše věřících.

ASN.1


Zdroje

Osobní nástroje
Jmenné prostory
Varianty
Akce
Výuka
Navigace
Nástroje