#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)); }