Well, it depends on what encoding you’re using.
Lately I’ve been in “endian-ness” hell on a project I’m working on. Well, not really a “hell”, more of a hurdle that can easily be overcome. A friend of mine recently asked me the difference between the two binary encoding strategies and when I went to explain it to him (via cell phone txt messaging) I quickly realized that I will run up both our bills pretty quickly by doing so. So here’s the quick rundown, and an example as it applies to the project I am working on.
Big Endian means that value is stored “from left to right”. The most significant values (bytes) are stored in memory with the lowest address first. This is probably what many people are familiar with, especially those in the networking field. Here’s an example of data stored as Big Endian:
Take for instance the 2-byte value 1325, equivalent to a short or unsigned short. Stored in Big Endian encoding, the value would look like this in binary: 00000101 00101101. Makes sense right?
Now here is the same 2-byte value, 1325, in Little Endian encoding: 00101101 00000101. The bytes are flipped and thus to make any sense of it, you must read the last set of bits first.
So for simplicity’s sake, Big Endian values are stored like so:
<byte1> <byte2> <byte3> <byte4> ... <byten>
Little Endian values are stored like so:
<byten> ... <byte4> <byte3> <byte2> <byte1>
Network devices use Big Endian, it is considered the network standard, or “network encoding”. Endian-ness varies from CPU to CPU depending on its architecture. Power Macs use Big Endian, network devices use Big Endian. Intel PC’s (and Intel Macs) use Little Endian. What does that mean? Well, it means that if a program running on a Power Mac sends data to a PC, the PC may not understand it correctly without some type of encoding change taking place.
In my situation, I’m reading a series of values off of the network, all coming in via a byte stream. So the client will send the following packet for example:
4 bytes, 2 bytes, 1 byte, … and some others but I won’t get into them
So when I read the first four bytes off the network (which uses Big Endian encoding, remember?) I must flip the entire set of 4 bytes before my Little Endian PC can understand it. Same goes for the next 2 bytes. The single byte obviously doesn’t need to be flipped with anything, it stands alone. So an incoming set of data may look like:
0x1A 0x2B 0x3C 0x4D 0x2A 0x2B 0xAD
Now I must flip each set of values byte by byte (but not invert the entire thing; this is a packet, containing multiple values).
In Little Endian, the same set of data reads:
0x4D 0x3C 0x2B 0x1A 0x2B 0x2A 0xAD
Confused yet? You’ll figure it out. Here’s some reading that should help: http://en.wikipedia.org/wiki/Endianness. It even gets into the origins of the word, which is pretty interesting. Here’s a little tool that may help you understand the pattern: http://dlnova.com/reverseendian.htm
You must be logged in to post a comment.