2009-01-20 13 views
7

Jakie są podstawowe transformacje, które są niezbędne do konwersji danych w systemie typu little-endian do kolejności bajtów sieciowych? W przypadku danych 2-bajtowych i 4-bajtowych istnieją dobrze znane funkcje (takie jak htons, ntohl, itd.) Do enkapsulacji zmian, co dzieje się z ciągami danych o 1 bajcie (jeśli w ogóle)?Jakie transformacje są używane przez małe systemy do konwersji danych do porządku sieciowego?

Co więcej, Wikipedia sugeruje, że little-endian jest lustrzanym odbiciem big-endianina, ale jeśli to prawda, dlaczego potrzebowalibyśmy specjalnej obsługi dla 2 i 4-bajtowych danych?

Esej "O świętych wojnach i prośbie o pokój" zdaje się sugerować, że istnieje wiele różnych smaków małego endianina - to stary esej - czy to wciąż ma zastosowanie? Czy znaczniki kolejności bajtów, takie jak te znajdujące się na początku plików klas Java, są nadal potrzebne?

Wreszcie, konieczne jest 4-bajtowe wyrównanie dla kolejności bajtów sieciowych?

Odpowiedz

6

Załóżmy, że masz tekst ASCII "BigE" w tablicy b bajtów.

b[0] == 'B' 
b[1] == 'i' 
b[2] == 'g' 
b[3] == 'E' 

To jest kolejność sieci również dla napisu.

Jeśli był on traktowany jako 32 bitowa liczba całkowita, byłoby

'B' + ('i' << 8) + ('g' << 16) + ('E' << 24) 

na małej platformie endian i

'E' + ('g' << 8) + ('i' << 16) + ('B' << 24) 

na wielkiej platformie endian.

Jeśli konwertować każdą pracę 16-bitowy oddzielnie, można dostać żadna z tych

'i' + ('B' << 8) + ('E' << 16) + ('g' << 24) 

dlatego są wymagane ntohl i ntohs.

Innymi słowy, ntohs zamienia bajty w ciągu 16-bitowym, a ntohl odwraca kolejność czterech bajtów słowa 32-bitowego.

0

Specyficzne funkcje obsługi dla danych 2- i 4-bitowych wykorzystują fakt, że istnieją instrukcje procesora, które działają na określonych rozmiarach danych. Jednokrotne uruchamianie funkcji odwracania 1-bajtowego jest z pewnością mniej wydajne niż użycie szerszych instrukcji do wykonywania tych samych (aczkolwiek zwiększonych skal) operacji na wszystkich czterech bajtach jednocześnie.

0

1-bajtowe dane nie wymagają żadnej konwersji między endianami (jest to zaleta UTF-8 ponad UTF-16 i UTF-32 dla kodowania ciągów znaków).

0

to 4-bajtowe wyrównanie niezbędne dla kolejności bajtów sieciowych?

Brak specyficznego wyrównania dla bajtów przechodzących przez sieć. Twój procesor może wymagać pewnego wyrównania w pamięci, ale to Ty decydujesz o rozbieżności. Rodzina x86 zwykle nie stawia takich wymagań.

0

Podstawową ideą jest, że wszystkie typy wielobajtowe muszą mieć odwróconą kolejność bajtów. Czterobajtowa liczba całkowita miałaby bajty 0 i 3 zamienione, a bajty 1 i 2 zamienione. Dwulitowa liczba całkowita miałaby bajty 0 i 1 zamienione. Jedna bajtowa postać nie zostaje zamieniona.

Istnieją dwa bardzo ważne Konsekwencje tego, że brak praktycy i nowicjusze nie zawsze zdają sobie sprawy:

  1. (ASCII) Ciągi znaków nie są dotykane.
  2. Istnieje no możliwy algorytm ślepy na bajt zamieniający ogólne "dane". Musisz znać typ wszystkich swoich danych i zamienić każdą pozycję w sposób wymagany dla jej typu.
Powiązane problemy