Kurs programowania w C cz. 153

Nasza ocena:

3
Pobrań: 7
Wyświetleń: 658
Komentarze: 0
Notatek.pl

Pobierz ten dokument za darmo

Podgląd dokumentu
Kurs programowania w C cz. 153 - strona 1

Fragment notatki:

PORZĄDEK BAJTÓW I BITÓW 173 Porządek bajtów i bitów Bajty i słowa Wiesz zapewne, że podstawową jednostką danych jest bit, który może mieć wartość 0 lub 1. Kilka kolejnych bitów 2  stanowi bajt (dla skupienia uwagi, przyjmijmy, że bajt składa się z 8 bitów). Często typ short ma wielkość dwóch bajtów i wówczas pojawia się pytanie w jaki sposób są one zapisane w pamięci — czy najpierw ten bardziej znaczący —  big-endian , czy najpierw ten mniej znaczący —  little-endian . Skąd takie nazwy? Otóż pochodzą one z książki  Podróże Guliwera , w której liliputy kłóciły się o stronę, od której należy rozbijać jajko na twardo. Jedni uważali, że trzeba je rozbijać od grubszego końca (big-endian) a drudzy, że od cieńszego (little-endian). Nazwy te są o tyle trafne, że w wypadku procesorów wybór kolejności bajtów jest sprawą czysto polityczną, która jest technicznie neutralna. Sprawa się jeszcze bardziej komplikuje w przypadku typów, które składają się np. z 4 bajtów. Wówczas są aż 24 (4 silnia) sposoby zapisania kolejnych fragmentów takiego typu. W praktyce zapewne spotkasz się jedynie z kolejnościami big-endian lub little-endian, co nie zmienia faktu, że inne możliwości także istnieją i przy pisaniu programów, które mają być przenośne należy to brać pod uwagę. Poniższy przykład dobrze obrazuje oba sposoby przechowywania zawartości zmiennych w pamięci komputera (przyjmujemy CHAR BIT == 8 oraz sizeof(long) == 4, bez bitów wypełnienia (ang.  padding bits )): unsigned long zmienna = 0x01020304; w pamięci kom- putera będzie przechowywana tak: adres | 0 | 1 | 2 | 3 | big-endian |0x01|0x02|0x03|0x04| little-endian |0x04|0x03|0x02|0x01| Konwersja z jednego porządku do innego Czasami zdarza się, że napisany przez nas program musi się komunikować z innym pro- gramem (może też przez nas napisanym), który działa na komputerze o (potencjalnie) innym porządku bajtów. Często najprościej jest przesyłać liczby jako tekst, gdyż jest on niezależny od innych czynników, jednak taki format zajmuje więcej miejsca, a nie zawsze możemy sobie pozwolić na taką rozrzutność. Przykładem może być komunikacja sieciowa, w której przyjęło się, że dane przesyłane są w porządku big-endian. Aby móc łatwo operować na takich danych, w standardzie POSIX zdefiniowano następujące funkcje (w zasadzie zazwyczaj są to makra): #include  uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort);

(…)

…);
netlong);
netshort);
Pierwsze dwie konwertują liczbę z reprezentacji lokalnej na reprezentację big-endian (host
to network ), natomiast kolejne dwie dokonują konwersji w drugą stronę (network to host).
Można również skorzystać z pliku nagłówkowego endian.h, w którym definiowane są makra
pozwalające określić porządek bajtów:
#include <endian.h>
#include <stdio.h>
2 Standard wymaga aby było ich co najmniej…
... zobacz całą notatkę



Komentarze użytkowników (0)

Zaloguj się, aby dodać komentarz