2016-03-28 21 views
3

htons(), ana bayt sırasını ağ bayt sırasına dönüştürür.Bir Big-Endian sisteminde htons() ne yapar?

Ağ Bayt sırası Big-Endian ve host bayt sırası Little-Endian veya Big-Endian olabilir.

Küçük bir Endian sisteminde htons(), bir Multi-bayt değişkeninin sırasını Big-Endian'a dönüştürecektir. Host bayt sırası da Büyük Endian ise htons() ne yapacak?

+2

Bir noop olduğunu - hiçbir şey –

cevap

7

Ana makine bayt sırası da büyük bir endian ise htons() ne yapacak?

Hiçbir şey - tam anlamıyla. İlk olarak htons()'u tanıtmanın amacı, sisteminizin endianitesini önemsemeyen kod yazmanızı sağlamaktır. Fonksiyonların tanımlandığı başlık dosyası, endianitenin devreye girdiği tek yerdir. İşte

onun parametre ifadesi etrafında parantez ile htons değiştirir one implementation geçerli:

#if BYTE_ORDER == BIG_ENDIAN 

#define HTONS(n) (n) 
#define NTOHS(n) (n) 
#define HTONL(n) (n) 
#define NTOHL(n) (n) 

#else 

#define HTONS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8)) 
#define NTOHS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8)) 

#define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \ 
        ((((unsigned long)(n) & 0xFF00)) << 8) | \ 
        ((((unsigned long)(n) & 0xFF0000)) >> 8) | \ 
        ((((unsigned long)(n) & 0xFF000000)) >> 24)) 

#define NTOHL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \ 
        ((((unsigned long)(n) & 0xFF00)) << 8) | \ 
        ((((unsigned long)(n) & 0xFF0000)) >> 8) | \ 
        ((((unsigned long)(n) & 0xFF000000)) >> 24)) 
#endif 

#define htons(n) HTONS(n) 
#define ntohs(n) NTOHS(n) 

#define htonl(n) HTONL(n) 
#define ntohl(n) NTOHL(n) 
+1

"big endian" olarak tanımlanan veya bir "ağ düzen" endian mı yapar ağ bağımlı? Ağa bağımlı bir kez şüpheliyim, ama Linux sadece TCP/IP ağ bayt sırasını dikkate alıyor - bu büyük-endian. – chux