Little-endian to host conversion
Sometimes you will find data structures to read that are encoded little-endian. You may find these functions useful. They aren’t as nightmarish to read as macros and presumably your compiler will do right by them.
#include <stdio.h>
#include <arpa/inet.h>/*
** Little endian to host, short
*/
static unsigned short ltohs( unsigned short v)
{
if ( htons(1) == 1) {
return ((v>>8)&0xff) | ((v<<8)&0xff00);
} else return v;
}/*
** Little endian to host, Long
*/
static unsigned long ltohl( unsigned long v)
{
if ( htons(1) == 1) {
return ((v>>24)&0xff) | ((v>>8)&0xff00) |
((v<<8)&0xff0000) | ((v << 24)&0xff000000);
} else return v;
}/*
** Little endian to host, "double" i.e. long long
*/
static unsigned long long ltohd( unsigned long long v)
{
if ( htons(1) == 1) {
return (unsigned long long)ltohl( v&0x00000000ffffffff) << 32 |
(unsigned long long)ltohl( (v>>32)&0x00000000ffffffff);
} else return v;
}int main( int argc, char **argv)
{
unsigned char t1[] = { 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08 };
unsigned char t2[] = { 0xff, 0xfe, 0xfd, 0xfc,
0xfb, 0xfa, 0xf9, 0xf8 }; printf("ltohs(01,02) = %04x\n", ltohs(*(unsigned short *)t1));
printf("ltohs(ff,fe) = %04x\n", ltohs(*(unsigned short *)t2));
printf("ltohl(01,02,03,04) = %08x\n", ltohl(*(unsigned long *)t1));
printf("ltohl(ff,fe,fd,fc) = %08x\n", ltohl(*(unsigned long *)t2));
printf("ltohd(01,02,03,04,05,06,07,08) = %016llx\n",
ltohd(*(unsigned long long *)t1));
printf("ltohd(ff,fe,fd,fc,fb,fa,f9,f8) = %016llx\n",
ltohd(*(unsigned long long *)t2));
}