OneAn alternative is to use union and struct, and let the compiler do the work:
static inline uint32_t bswap32(uint32_t x)
{
union {
uint32_t x;
struct {
uint8_t a;
uint8_t b;
uint8_t c;
uint8_t d;
} s;
} in, out;
in.x = x;
out.s.a = in.s.d;
out.s.b = in.s.c;
out.s.c = in.s.b;
out.s.d = in.s.a;
return out.x;
}
uint32_t sinceEpoch = bswap32(*(uint32_t*) &packetBuffer[40]);
A cleaner rewrite for the packet buffer would be:
static inline uint32_t bswap32(uint8_t* buf)
{
union {
uint32_t x;
struct {
uint8_t a;
uint8_t b;
uint8_t c;
uint8_t d;
} s;
} in, out;
out.s.a = buf[3];
out.s.b = buf[2];
out.s.c = buf[1];
out.s.d = buf[0];
return out.x;
}
uint32_t sinceEpoch = bswap32(&packetBuffer[40]);
Ref. Cosa/Types.h, https://github.com/mikaelpatel/Cosa/blob/master/cores/cosa/Cosa/Types.h#L553, and Cosa-NTP/NTP.cpp, https://github.com/mikaelpatel/Cosa-NTP/blob/master/NTP.cpp#L56