DOES htonl() change byte order on BIG ENDIAN machine?

限于喜欢 提交于 2020-02-01 03:21:06

问题


Literally confused about htonl(). In so many links I found that code to do htonl is :

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

If the same code is ran on both the machines, it is going to swap the byte orders. Example : uint32_t a = 0x1;

On Little Endian:

Addr value

100   1
101   0
102   0
103   0

After htonl(a)

Addr value

100   0
101   0
102   0
103   1

============================================ On Big Endian machine:

Addr value

100   0
101   0
102   0
103   1

After htonl(a)

Addr value

100   1
101   0
102   0
103   0

Does that mean that htonl() will change the order of the bytes irrespective of machine architecture ?


回答1:


If you use it correctly then it should not swap bytes on big endian machines.

htonl is defined in a header which is architecture specific. Normally machine/endian.h will include your architecture specific header. If you redefine it then it will do what you set it to. If you want the real behaviour then you should always use the right architecture header. On big endian machines it's a no op. On little endian machines it's often linked to a specific processor instruction.




回答2:


I think key to understanding the function is understanding its name. The function htonl is:
H ost to N etwork L ong

That is: it converts from the Host order to the Network defined (Big Endian) order.

Different hosts could have different representations:

  • Big-Ending
  • Little-Endian
  • even some other representation (imagine some new machine that works on base-3, or has Middle-Outwards representation?

Whatever the machine format, this function converts to a common Network format so the data can be easily, reliably sent to other machines on the network that may have different representations.

Once you understand the concept of Host / Network, then it shouldn't be hard to understand that Network order is Big-Endian, and any Host that is Big-Endian doesn't need any conversion at all.



来源:https://stackoverflow.com/questions/21311435/does-htonl-change-byte-order-on-big-endian-machine

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!