Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What transformations are used by little-endian systems to convert data to network order?

What are the underlying transformations that are necessary to convert data in a little-endian system into network byte order? For 2 byte and 4 byte data there are well-known functions (such as htons, ntohl, etc.) to encapsulate the changes, what happens for strings of 1 byte data (if anything)?

Also, Wikipedia implies that little-endian is the mirror image of big-endian, but if that were true why would we need specific handling for 2 and 4 byte data?

The essay "On Holy Wars and a Plea for Peace" seems to imply that there are many different flavors of little-endian -- it's an old essay -- does that still apply? Are byte order markers like the ones found at the beginning of Java class files still necessary?

And finally, is 4-byte alignment necessary for network-byte order?

like image 945
Paul W Homer Avatar asked Jan 20 '09 22:01

Paul W Homer


1 Answers

Let's say you have the ASCII text "BigE" in an array b of bytes.

b[0] == 'B'
b[1] == 'i'
b[2] == 'g'
b[3] == 'E'

This is network order for the string as well.

If it was treated as a 32 bit integer, it would be

'B' + ('i' << 8) + ('g' << 16) + ('E' << 24) 

on a little endian platform and

'E' + ('g' << 8) + ('i' << 16) + ('B' << 24) 

on a big endian platform.

If you convert each 16-bit work separately, you'd get neither of these

'i' + ('B' << 8) + ('E' << 16) + ('g' << 24) 

which is why ntohl and ntohs are both required.

In other words, ntohs swaps bytes within a 16-bit short, and ntohl reverses the order of the four bytes of its 32-bit word.

like image 75
Doug Currie Avatar answered Jan 01 '23 23:01

Doug Currie