450 likes | 747 Views
Architektura systemów komputerowych (jesień 2013). Wykład 4 Reprezentacja danych część 4. dr inż. Wojciech Bieniecki Instytut Matematyki i Informatyki http://wbieniec.kis.p.lodz.pl/pwsz. Kolejność bajtów w słowach.
E N D
Architektura systemów komputerowych(jesień 2013) Wykład 4 Reprezentacja danych część 4 dr inż. Wojciech Bieniecki Instytut Matematyki i Informatyki http://wbieniec.kis.p.lodz.pl/pwsz
Kolejność bajtów w słowach W sytuacjach, kiedy liczby, znaki lub inne dane zapisywane są przy użyciu wielu bajtów, nie istnieje jeden unikatowy sposób uporządkowania tych bajtów w pamięci. Musi być użyta jedna z wielu konwencji ustalająca kolejność bajtów (byte order lub endianness). Analogia do zapisu pozycyjnego liczb lub kierunku pisma w różnych językach – ze strony lewej na prawą albo z prawej na lewo. Ciekawostka: Użyte poniżej nazwy big endian i littleendian pochodzą z książki Jonathana Swifta Podróże Guliwera i odnoszą się do mieszkańców Liliputu, których spór o to, czy ugotowane jajko należy tłuc od grubego (tępego), czy od cienkiego (ostrego) końca, doprowadził do podziału na dwa stronnictwa toczące ze sobą niekończące się, choć bezsensowne dysputy i wojny.
Kolejność bajtów w słowach Little endian (spotykane także cienkokońcowość) to forma zapisu danych, w której mniej znaczący bajt (zwany też dolnym bajtem, low-orderbyte, LSB) umieszczony jest jako pierwszy. Procesor zapisujący 32-bitowe wartości w pamięci, przykładowo 4A 3B 2C 1D pod adresem 100, umieszcza dane zajmując adresy od 100 do 103 w następującej kolejności: Procesory, które używają formy littleendian, to między innymi wszystkie z rodziny x86, DEC VAX
Kolejność bajtów w słowach Big endian(spotykane także grubokońcowość) to forma zapisu danych, w której najbardziej znaczący bajt (zwany też grubym bajtem, z ang. high-order byte) umieszczony jest jako pierwszy. Procesor zapisujący 32-bitowe wartości w pamięci, przykładowo 4A 3B 2C 1D pod adresem 100, umieszcza dane, zajmując adresy od 100 do 103 w następującej kolejności: Procesory, które używają formy big endian, to między innymi SPARC, Motorola 68000, PowerPC 970, IBM System/360, Siemens SIMATIC S7. Istnieją także procesory, w których można przełączyć tryb kolejności bajtów, należą do nich na przykład PowerPC (do serii PowerPC G4), SPARC, ARM, MIPS
Kolejność bajtów w słowach - odwracanie X = aaaaaaaa bbbbbbbb cccccccc dddddddd m1= 11111111 00000000 00000000 00000000 m2= 00000000 11111111 00000000 00000000 m3= 00000000 00000000 11111111 00000000 m4= 00000000 00000000 00000000 11111111 W1 = (X & m1)>>24 = 00000000 00000000 00000000 aaaaaaaa W2 = (X & m2)>>8 = 00000000 00000000 bbbbbbbb 00000000 W3 = (X & m3)<<8 = 00000000 cccccccc 00000000 00000000 W4 = (X & m3)<<24 = dddddddd 00000000 00000000 00000000 intreverseEndian(int x) { return (x&0xff000000)>>24 | (x&0x00ff0000)>> 8 | (x&0x0000ff00)<< 8 | (x&0x000000ff)<<24; }
Kod ASCII ASCII (American Standard Code for InformationInterchange) Opracowany dla urządzeń dalekopisowych, później przyjęty dla komputerów 7-bitowy kod przyporządkowujący liczby z zakresu 0-127 literom (alfabetu angielskiego), cyfrom, znakom przestankowym i innym symbolom oraz poleceniom sterującym litery, cyfry oraz inne znaki drukowane tworzą zbiór znaków ASCII - jest to 95 znaków o kodach 32-126 pozostałe 33 kody (0-31 i 127) to tzw. kody sterujące służące do sterowania urządzeniem odbierającym komunikat, np. drukarką czy terminalem
Kod ASCII – znaki sterujące 33 kody – 0-31 i 127 znaki niedrukowalne: sygnały dźwiękowe, białe znaki (tabulacja, spacja, znak końca wiersza, powrót na początek wiersza)
Kod ASCII – zakończenie wiersza W systemie DOS/ Windows każdy wiersz pliku zakończony jest parą znaków: CR, kod ASCII - 13(10) = 0D(16) - powrót na początek wiersza LF, kod ASCII - 10(10) = 0A(16) - przesunięcie o wiersz w systemie Linux znakiem końca wiersza jest tylko: LF, kod ASCII - 10(10) = 0A(16) podczas przesyłania pliku tekstowego z systemu Linux do systemu DOS/Windows pojedynczy znak LF zamieniany jest automatycznie na parę znaków CR i LF błędne przesłanie pliku tekstowego (w trybie binarnym) powoduje nieprawidłowe jego wyświetlanie
Kod ASCII – znak końca wiersza DOS / Windows (32B): UNIX / Linux (30B): Mac OS (30B):
Podstawowe funkcje znakowe isdigit– czy znak jest cyfrą? isalnum – czy znak jest literą? isspace– czy znak jest odstępem? ispunct– czy znak jest znakiem przestankowym? isprint– czy znak jest znakiem drukowanym isgraph – czy znak jest symbolem graficznym? toupper – zamiana małych liter na duże tolower – zamiana dużych liter na małe
isdigit 0110000 0 0110001 1 0110010 2 0110011 3 0110100 4 0110101 5 0110110 6 0110111 7 0111000 8 0111001 9 int isdigit(char c) { return (c>=48 && c<=58); }
isalnum int isupper(char c) { return (c>='A' && c<='Z'); } int islower(char c) { return (c>='a' && c<='z') } int isalpha(char c) { return ((c>='A' && c<='Z') || (c>='a' && c<='z')); }
toupper, tolower char toupper(char c) { if ( (c >= 'a') && (c <= 'z') ) c = c - ('a' - 'A'); return c; } char tolower(char c) { if ( (c >= 'A') && (c <= 'Z') ) c = c + ('a' - 'A'); return c; }
Rozszerzony od ASCII Kod ASCII w wersji podstawowej jest 7-bitowy Większość komputerów pracuje na 8-bitowych bajtach Dodatkowy bit jest wykorzystywany do powiększenia zbioru kodowanych znaków Powstało wiele ro żnych rozszerzeń ASCII wykorzystują cych o smy bit, nazywanych stronami kodowymi (np. norma ISO 8859, rozszerzenia firm IBM lub Microsoft)
Kod ASCII – strony kodowe Strony kodowe – wersje kodu ASCII różniące się interpretacją symboli o numerach od 128 do 255. RÓżne strony kodowe mogą przyjąć odmienne znaki dla tego samego kodu Różne strony kodowe mogą różnić się wyborem znaków Duża liczba dostępnych stron kodowych wynika z faktu, że na 8 bitach można zakodować tylko 256 rożnych znaków, co jest niewystarczające do zmieszczenia w jednym zestawie znaków wszystkich alfabetów Przykłady stron kodowych uwzględniające polskie litery: ISO 8859-2 (Latin-2), ISO 8859-16 (Latin-10)
ISO 8859 Zestaw standardów służących do kodowania znaków za pomocą 8 bitów Standardy te zostały utworzone przez European Computer Manufactures’ Association (ECMA) w połowie lat osiemdziesiątych, a następnie uznane przez ISO Wszystkie zestawy ISO 8859 mają znaki 0-127 takie same jak ASCII Pozycjom 128-159 przypisane są dodatkowe kody sterujące, tzw. C1 (faktycznie są nieużywane).
Standardy ISO 8859 ISO 8859-1 (Latin-1) - alfabet łaciński dla Europy zachodniej ISO 8859-2 (Latin-2) – alfabet łaciński dla Europy środkowej i wschodniej, również odpowiednia Polska Norma ISO 8859-3 (Latin-3) – alfabet łaciński dla Europy południowej ISO 8859-4 (Latin-4) – alfabet łaciński dla Europy północnej ISO 8859-5 (Cyrlic) – alfabet dla cyrylicy ISO 8859-6 (Arabic) - dla alfabetu arabskiego ISO 8859-7 (Greek) - dla alfabetu greckiego ISO 8859-8 (Hebrew) - dla alfabetu hebrajskiego ISO 8859-9 (Latin-5) ISO 8859-10 (Latin-6) ISO 8859-11 (Thai) - dla alfabetu tajskiego ISO 8859-13 (Latin-7) ISO 8859-14 (Latin-8) ISO 8859-15 (Latin-9) - z ISO 8859-1 usunięto kilka rzadko używanych znaków i wprowadzono znak Euro oraz litery Š, š , Ž, ž, OE , oe oraz Ÿ ISO 8859-16 (Latin-10) – alfabet łaciński dla Europy środkowej - zmodyfikowany ISO 8859-2 ze znakiem Euro i dodatkowymi literami dla kilku języków.
Kod ISO 8859-1 kodowanie używane w Amerykach, Europie Zachodniej, Oceanii i większej części Afryki dostępne języki: albański, angielski, baskijski, duński, estoński, fiński, francuski, hiszpański, irlandzki, islandzki, kataloński, łaciński, niderlandzki, niemiecki, norweski, portugalski, retoromański, szkocki, szwedzki, włoski składa się ze 191 znaków łacińskiego pisma po rozszerzeniu o dodatkowe przypisania znaków jest podstawą dla dwóch mapowań znaków ISO-8859-1 i Windows-1252
Kod ISO 8859-2 dostępne języki: bośniacki, chorwacki, czeski, węgierski, polski, rumuński, serbski, słowacki, słoweński, górno- i dolnołużycki możliwość przedstawienia znaków w języku niemieckim i angielskim składa się ze 191 znaków łacińskiego pisma zapisywanych na 8-bitach kody z przedziałów 00(16)-1F(16) oraz 7F(16)-9F(16) nie są używane w ISO-8859-2 kodowanie to jest zgodne z Polską Normą
Windows 1250 Standard kodowania używana przez system Microsoft Windows do reprezentacji tekstów w językach środkowoeuropejskich używających alfabetu łacińskiego, takich jak albański, chorwacki, czeski, polski, rumuński, słowacki, węgierski jest podobny do ISO 8859-2 – posiada wszystkie jego drukowalne znaki (a także kilka dodatkowych), lecz kilka z nich zajmuje inne miejsca
Windows 1250 i ISO 8859-2 NZ - znak niezdefiniowany w kodowaniu ZK znak kontrolny, Znakznak wspólny dla obydwu kodowań.
Kodowanie polskich znaków Tekst przykładowy: Ą Ć Ę Ł Ń Ó Ś Ź Ż ą ć ę ł ń ó ś ź ż Tekst zapisany w standardzie ISO – 8859-2 Tekst zapisany w standardzie CP-1250 ISO-8859-2 wyświetlony w edytorze obsługującym CP-1250 ˇ Ć Ę Ł Ń Ó ¦ ¬ Ż ± ć ę ł ń ó ¶ Ľ ż CP-1250 wyświetlony w edytorze obsługującym ISO-8859-2 Ľ Ć Ę Ł Ń Ó Ż š ć ę ł ń ó ż
Standardy kodowania polskich znaków W Polsce stosowanych było ok. 20 standardów kodowania polskich liter Próby wprowadzania standardu Mazovia - promowany przez społeczność informatyczną w Polsce (nie był pełną stroną kodową , ale określał sposób kodowania polskich liter) IBM-Latin-2 (CP-852) - stosowany w DOS, OS/2 i części systemu Windows CP-1250 (Windows-1250) – stosowany w MS Windows PL ISO-Latin-2 (ISO 8859-2) - stosowany w Internecie Standard ISO 8859-2 jest zgodny z Polską Normą PN-93 T-42118
Unicode Komputerowy zestaw znaków mający w zamierzeniu obejmować wszystkie pisma i inne znaki (symbole muzyczne, techniczne, wymowy) używane na świecie Unicode przypisuje unikalny numer każdemu znakowi, niezależnie od używanej platformy, programu czy języka Definiowany jest przez dwa standardy, w których znaki są identyczne: Unicode i ISO/IEC 10646 Standard Unicode zaimplementowany został w wielu nowych technologiach, np. XML, Java, Microsoft .NET Framework, nowe systemy operacyjne
Unicode Rozwijany jest przez konsorcjum, w skład którego wchodzą firmy komputerowe, producenci oprogramowania oraz grupy użytkowników - http://www.unicode.org Strona polska: http://www.unikod.pl Pierwsza wersja: Unicode 1.0 (październik 1991) Ostatnia wersja: Unicode 6.1.0 (styczeń 2012)
Podstawowe właściwości Unicode Jednoznaczność – każdemu znakowi zakodowanemu za pomocą Unicode odpowiada zawsze ta sama wartość liczbowa i odwrotnie. Uniwersalność – dostępne znaki obejmują wszystkie powszechnie używane języki i symbole. 16-bitowa reprezentacja – każdy znak reprezentowany jest w postaci 16-bitowej liczby, czyli można zakodować 216=65536 różnych znaków Efektywność – ułatwienie manipulowania tekstami, gdyż identyfikacja znaku nie zależy od sekwencji sterujących czy znaków następujących bądź poprzedzających
UTF-8 – kodowanie znaków Unicode UnicodeTransformation Format. Jest to przykład kodu bajtowego Mapowanie znaków Unikodu na ciągi bajtów: 0x00 do 0x7F - 0xxxxxxx 0x80 do 0x7FF - 110xxxxx 10xxxxxx 0x800 do 0xFFFF - 1110xxxx 10xxxxxx 10xxxxxx 0x10000 do 0x1FFFFF - 11110xxx 10xxxxxx 10xxxxxx10xxxxxx 0x200000 do 0x3FFFFFF - 111110xx 10xxxxxx 10xxxxxx10xxxxxx10xxxxxx 0x4000000 do 0x7FFFFFFF - 1111110x 10xxxxxx 10xxxxxx10xxxxxx10xxxxxx10xxxxxx Dla pierwszych znaków z przedziału ASCII od 0 do 127 (czyli dla npj.ang) znak jest mapowany jako jeden bajt. Dla znaków powyżej (np. polskie znaki) jest mapowany jako dwa bajty (lub więcej).
UTF-8 - kodowanie oznacza to, że ten sam znak można zapisać na kilka sposobów. Przykładowo znak ASCII / (ukośnik) można zapisać jako: 00101111 11000000 10101111 11100000 10000000 10101111 Standard UTF-8 przewiduje, że każdy program MUSI odrzucać wszystkie znaki zapisane sekwencjami dłuższymi niż minimalna.
UTF-8 Zalety Każdy tekst w ASCII jest tekstem w UTF-8. Żaden znak spoza ASCII nie zawiera bajtu z ASCII. Zachowuje porządek sortowania UCS-4. Typowy tekst ISO-Latin-X rozrasta się w bardzo niewielkim stopniu po przekonwertowaniu do UTF-8. Nie zawiera bajtów 0xFF i 0xFE, więc łatwo można go odróżnić od tekstu UTF-16. Znaki o kodzie różnym od 0 nie zawierają bajtu 0, co pozwala stosować UTF-8 w ciągach zakończonych zerem. O każdym bajcie wiadomo, czy jest początkiem znaku, czy też leży w jego środku (co nie jest prawdą np. w kodowaniu EUC). Nie ma problemów z littleendian i big endian. Jest domyślnym kodowaniem w XML (również w jego aplikacjach: XHTML, SVG, XSL, CML, MathML)
UTF-8 – Wady Znaki CJK (chiński-japoński-koreański) zajmują po 3 bajty zamiast 2 w kodowaniach narodowych. Znaki alfabetów niełacińskich zajmują po 2 bajty zamiast jednego w kodowaniach narodowych. UTF-8 nie używa przesunięć zasięgów, co stanowi dodatkowe utrudnienie dla implementacji UTF-8 • Problemu tego można byłoby uniknąć, przy okazji skracając nieznacznie długość danych, jeśli wykorzystano by zasadę przesunięć typu: • sekwencje 1-bajtowe kodują 0x80 różnych znaków - od 0x00 do 0x7F • sekwencje 2-bajtowe kodują 0x800 różnych znaków - od 0x80 do 0x87F • sekwencje 3-bajtowe kodują 0x10000 różnych znaków - od 0x880 do 0x1087F • itd.
UTF-16 Sposób ten wymaga użycia szesnastobitowych słów Dla znaków na pozycjach poniżej 65536 (przedział 0000-FFFF) używane jest jedno słowo, którego wartość odpowiada pozycji znaku w standardzie. Dla znaków z wyższych pozycji używa się dwóch słów. Pierwsze z nich należy do przedziału D800–DBFF, drugie: DC00-DFFF. Znak o kodzie szesnastkowym 10000 zostanie zamieniony na sekwencję D800 DC00 a znak o kodzie 10FFFD (górna granica unikodu) na DBFF DFFD. W standardzie Unicode pozycjom z przedziału D800–DFFF nie są przypisane żadne znaki, zatem każda sekwencja słów kodowych jest interpretowana jednoznacznie.
UTF-32 wymaga użycia trzydziestodwubitowych słów. Zestaw znaków jest też zdefiniowany w standardzie ISO 10646 jako UCS-4 Kody obejmują zakres od 0 do 0x7FFFFFFF. Kod znaku zawsze ma długość 4 bajtów i w zapisie big endian przedstawia po prostu numer znaku w tabeli Unikodu. ZALETA Stała długość kodu każdego znaku WADA Mała efektywność- zakodowane ciągi znaków są dwa do czterech razy dłuższe niż ciągi tych samych znaków zapisanych w innych kodowaniach. ZASTOSOWANIE tylko w RAM w celu ułatwienia obsługi i przetwarzania (np. obliczenie długości czy wycinanie ciągu znaków jest bardzo proste)
Kod EBCDIC (ang. ExtendedBinaryCodedDecimalInterchangeCode, czyli rozszerzony dziesiętny zakodowany dwójkowo kod wymiany) to ośmiobitowe kodowanie znaków używane głównie w systemach IBM. Pojedynczy znak zapisywany jest na 8 bitach podzielonych na dwie części. Pierwsze 4 bity, nazywane strefą, oznaczają grupę do jakiej dany znak należy, podczas gdy ostatnie 4 bity, zwane cyfrą, identyfikują konkretny znak.
Kod Radix-50 Kod ten jest nazywany Rad-50 lub RAD50, zaprojektowany przez Digital Equipment Corporation dla komputerów DECsystem, PDP, i VAX. • Kod ten ma pozwala zapisać 40 różnych znaków (ósemkowo 50), w tym spacja, 26 liter, znak dolara, kropka, cyfry w dwóch wariantach: • 3 znaki na słowie 16 bitowym. • 6 znaków wraz z flagą informacyjną na słowie 36 bitowym.
Kod Radix-50 Łańcuchy tekstowe są kodowane na kolejnych słowach. Pierwszy znak w obrębie słowa zajmuje najstarszą pozycję. Przykład: Zakodować napis ABCDEF używając PDP-11. Wartości znaków to 1,2,3,4,5,6. Będą one zakodowane jako słowa: (1*40 + 2) * 40 + 3 = 1683 (4*40 + 5) * 40 + 6 = 6606 Każdy łańcuch jest uzupełniany spacjami na końcu do wielokrotności trzech znaków.
Kod Radix-50 Istnieje wiele odmian kodowania Rad-50. Np. w systemie operacyjnym RT-11 wartość 011101 jest określona jako niezdefiniowana natomiast programy użytkowe przypisywały jej reprezentację * Użycie Rad-50 wymusiło konwencję zapisu nazw plików w systemie PDP-11. Nazwa pliku składa się z 6 znaków nazwy właściwej i trzech znaków rozszerzenia. Cały łańcuch można było zapisać na trzech słowach (kropki rozdzielającej nie trzeba pamiętać) Rad-50 był często stosowany w tablicach symboli dla różnych języków programowania dla PDP-11.
Kod Base64 Base64 służy do kodowania ciągu bajtów za pomocą ciągu znaków Przypisuje 64 wybranym znakom wartości od 0 do 63. Ciąg bajtów poddawany kodowaniu dzielony jest na grupy po 3 bajty. Każdą taką grupę dzieli się następnie na 4 jednostki 6-bitowe. Istnieją więc dokładnie 64 możliwe wartości każdej takiej jednostki Jeśli rozmiar wejściowego ciągu bajtów nie jest wielokrotnością liczby 3, to stosowane jest dopełnianie
Kod Base64 Rodzaj kodowania transportowego • Wykorzystywane m.in. do: • przesyłania załączników binarnych w poczcie elektronicznej, • pamiętania ViewState w stronach WWW tworzonych przy użyciu technologii ASP.NET, • kodowania haseł wysyłanych w protokole SMTP podczas uwierzytelniania metodami PLAIN i LOGIN. Przykład: Idealysa jak gwiazdy - nie mozna ich osiagnac, ale mozna sie nimi kierowac. SWRlYWx5IHNhIGphayBnd2lhemR5IC0gbmllIG1vem5hIGljaCBvc2lhZ25hYywgYWxlIG1vem5hIHNpZSBuaW1pIGtpZXJvd2FjLg0K