Q: 到底ntohl()與htonl()做了什麼?
A: 'ntohl()'與'htonl()'是四個相關function中的其中二個,另外二個是'ntohs()'與'htons()',以下是Linux manual中的解釋:
- 'htonl()' function將unsigned integer hostlong從host byte order轉為network byte order.
- 'htons()' function將unsigned short integer hostshort從host byte order轉為network byte order.
- 'htohl()' function將unsigned integer netlong從network byte order轉為host byte order.
- 'ntohs()' function將unsigned short integer netshort從network byte order轉為host byte order.
這四個function在host byte order與network byte order之間做轉換。當二者的byte order不同時,則使用這些function會造成endian-ness的改變。當二者的byte ordre一樣時,則不會有任何的改變。因此,當你只是單純想要做endian-ness的轉換(無關乎平台),則不該使用這些function。
這一篇FAQ告訴你如何做無關乎平台的endian-ness轉換。
Special notes:- 'ntohs()', 'ntohl()', 'htons()', and 'htonl()' 並非C的標準函式,所以不能保證portability。
- POSIX 實作'ntohs()', 'ntohl()', 'htons()' and 'htonl()' 時,參數是以'uint16_t' 與 'uint32_t'做為type,這二個type可以在netinet/in.h這二個header file中找到。
- Windows實作使用'unsigned short'與'unsigned long',可以在winsock2.h這個header file中找到。
- 'ntoht()' 與 'htont()' 在其它的系統上可能還有著不同的變形,像是'ntohi()'/'htoni()' 或 'ntohll()'/'htonll()'.