Endianness
În funcție de ordinea în care un șir de octeti este stocat în memorie avem două interpretări: Little Endian și Big Endian. Reprezentarea cu care suntem cel mai bine obișnuiți este Big Endian, așa cum reprezentăm datele pe foaie: cel mai semnificativ octet este primul. În imaginea de mai jos avem un exemplu de cum un int pe 32 de biți, 0x01020304 poate avea valori diferite în funcție de cum este interpretat. De notat faptul că “endianness” e un concept
relevant doar pentru valori pe doi sau mai mulți octețî.

Endianness-ul este o proprietate a mașinii; în networking, ne interesează să putem interconecta un ansamblu eterogen de diverse mașini; de aceea a fost nevoie de standardizarea endianness-ului. Astfel, toate datele trimise în rețea trebuie să se găsească în Network Byte Order; aceasta este pur și simplu “Big Endian”. Fiecare mașină din rețea reprezintă datele în propriul endianness, etichetat abstract Host Byte Order; procesoarele moderne sunt, în general, little endian.
În API-ul POSIX avem mai multe funcții care se pot folosi pentru a face trecerea Host Order <-> Network Order:
#include <arpa/inet.h>
// host to network long
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
// network to host long
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort)
Ideea acestui API e să nu vă preocupați cu endianness-ul real al mașinii sau al rețelei. Trebuie să gândiți mereu la nivel abstract de “host byte order” și “network byte order” și să folosiți funcțiile corespunzătoare când transferați date între host și network. În practică, pe o mașină big-endian, aceste funcții ar fi goale, doar și-ar întoarce argumentul; însă nu ar trebui să vă gândiți la asta, și ar trebui să le folosiți în continuare, pentru că asta va face codul vostru să fie portabil.