1: //little endian to big endian
2: unsigned char littleEndianN = 5;
3: cout << (unsigned int)littleEndianN << "(size=" << sizeof(littleEndianN) * 8 << ") little endian is ";
4: unsigned char bigEndianN = 0;
5: for (int i = 0; i < sizeof(littleEndianN) * 8; i++) {
6: cout << (littleEndianN & 1);
7: bigEndianN |= (littleEndianN & 1);
8: littleEndianN >>= 1;
9: if (i < (sizeof(littleEndianN) * 8 - 1))
10: bigEndianN <<= 1;
11: }
12: cout << " meaning " << (unsigned int)bigEndianN << " in big endian" << endl;
Here's what this prints:
1: 5(size=8) little endian is 10100000 meaning 160 in big endian
What happens if the number is negative? Well, if we change all the unsigned char's to char's, the program prints this:
1: -5(size=8) little endian is 11011111 meaning -33 in big endian
Do you know why?
Also since we're on the subject, how do you tell if the computer representation is little endian or big endian? Spoiler below :)
1: bool isLittleEndian = ((1 << 1) == 2);
It's possible to do it faster if you know the bitlength of the data type. Basically, you linearize that loop.
ReplyDeleteconverting the little endian to big endian is moving the lower Byte from the lower address to the high address. In the example above; the bits in the byte are moved from the lower to highest.
ReplyDeleteConverting the little endian to big endian requires the knowledge whether the stream of byte coming is an integer(4 bytes long) or is a character(1 byte long) or is a double(8 byte long) or ... . Converting all these data types from little to big require the identification of the data type in the stream of byte
sizeof(littleEndianN) does not work for that ?
ReplyDelete