Since its an LE machine, I expect ntohl()
to be a no-op
That's the mistake. Network byte order is big-endian, host byte order is little-endian. Therefore, both ntohl
and htonl
return a byte-swapped version of their input.
Remember, the point of htonl
is that you can take an integer on the host, then write:
int i = htonl(a);
and the result is that the memory of i
, when interpreted using network byte order, has the same value that a
does. Hence, if you write the object representation of i
to a socket and the reader at the other end expects a 4-byte integer in network byte order, it will read the value of a
.
and display 0x78563412
Is this what you intended to write? If ntohl
were a no-op (or rather, an identity function), then your third line necessarily would print the same thing as your first line, because you would have ntohl(a) == a
. This is what happens on big-endian implementations, where your program prints:
Original - 0x12345678
Network - 0x12345678
Host - 0x12345678
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…