lwpa  0.1.0
LightWeight Platform Abstraction (lwpa)
View other versions:
lwpa_pack

Overview

Platform- and endianness-independent buffer packing and unpacking.

#include "lwpa_pack.h"

This module defines macros for packing and unpacking integer types to/from a byte buffer. They are architected in such a way that the endianness of the integer in the buffer is always known, regardless of the endianness of your platform.

Macros

#define upack_16b(ptr)
 Unpack a uint16_t from a known big-endian buffer. More...
 
#define pack_16b(ptr, val)
 Pack a uint16_t to a known big-endian buffer. More...
 
#define upack_16l(ptr)
 Unpack a uint16_t from a known little-endian buffer. More...
 
#define pack_16l(ptr, val)
 Pack a uint16_t to a known little-endian buffer. More...
 
#define upack_32b(ptr)
 Unpack a uint32_t from a known big-endian buffer. More...
 
#define pack_32b(ptr, val)
 Pack a uint32_t to a known big-endian buffer. More...
 
#define upack_32l(ptr)
 Unpack a uint32_t from a known little-endian buffer. More...
 
#define pack_32l(ptr, val)
 Pack a uint32_t to a known little-endian buffer. More...
 
#define upack_64b(ptr)
 Unpack a uint64_t from a known big-endian buffer. More...
 
#define pack_64b(ptr, val)
 Pack a uint64_t to a known big-endian buffer. More...
 
#define upack_64l(ptr)
 Unpack a uint64_t from a known little-endian buffer. More...
 
#define pack_64l(ptr, val)
 Pack a uint64_t to a known little-endian buffer. More...
 

Macro Definition Documentation

◆ pack_16b

#define pack_16b (   ptr,
  val 
)
Value:
do \
{ \
((uint8_t *)(ptr))[1] = (uint8_t) ((val) & 0xff); \
((uint8_t *)(ptr))[0] = (uint8_t)(((val) & 0xff00) >> 8); \
} while (0)

Pack a uint16_t to a known big-endian buffer.

Parameters
ptrPointer to the buffer into which to pack a uint16_t.
valuint16_t value to pack into the buffer.

◆ pack_16l

#define pack_16l (   ptr,
  val 
)
Value:
do \
{ \
((uint8_t *)(ptr))[0] = (uint8_t) ((val) & 0xff); \
((uint8_t *)(ptr))[1] = (uint8_t)(((val) & 0xff00) >> 8); \
} while (0)

Pack a uint16_t to a known little-endian buffer.

Parameters
ptrPointer to the buffer into which to pack a uint16_t.
valuint16_t value to pack into the buffer.

◆ pack_32b

#define pack_32b (   ptr,
  val 
)
Value:
do \
{ \
((uint8_t *)(ptr))[3] = (uint8_t) ((val) & 0xff); \
((uint8_t *)(ptr))[2] = (uint8_t)(((val) & 0xff00) >> 8); \
((uint8_t *)(ptr))[1] = (uint8_t)(((val) & 0xff0000) >> 16); \
((uint8_t *)(ptr))[0] = (uint8_t)(((val) & 0xff000000) >> 24); \
} while (0)

Pack a uint32_t to a known big-endian buffer.

Parameters
ptrPointer to the buffer into which to pack a uint32_t.
valuint32_t value to pack into the buffer.

◆ pack_32l

#define pack_32l (   ptr,
  val 
)
Value:
do \
{ \
((uint8_t *)(ptr))[0] = (uint8_t) ((val) & 0xff); \
((uint8_t *)(ptr))[1] = (uint8_t)(((val) & 0xff00) >> 8); \
((uint8_t *)(ptr))[2] = (uint8_t)(((val) & 0xff0000) >> 16); \
((uint8_t *)(ptr))[3] = (uint8_t)(((val) & 0xff000000) >> 24); \
} while (0)

Pack a uint32_t to a known little-endian buffer.

Parameters
ptrPointer to the buffer into which to pack a uint32_t.
valuint32_t value to pack into the buffer.

◆ pack_64b

#define pack_64b (   ptr,
  val 
)
Value:
do \
{ \
((uint8_t *)(ptr))[7] = (uint8_t) ((val) & 0xff); \
((uint8_t *)(ptr))[6] = (uint8_t)(((val) & 0xff00) >> 8); \
((uint8_t *)(ptr))[5] = (uint8_t)(((val) & 0xff0000) >> 16); \
((uint8_t *)(ptr))[4] = (uint8_t)(((val) & 0xff000000) >> 24); \
((uint8_t *)(ptr))[3] = (uint8_t)(((val) & 0xff00000000) >> 32); \
((uint8_t *)(ptr))[2] = (uint8_t)(((val) & 0xff0000000000) >> 40); \
((uint8_t *)(ptr))[1] = (uint8_t)(((val) & 0xff000000000000) >> 48); \
((uint8_t *)(ptr))[0] = (uint8_t)(((val) & 0xff00000000000000) >> 56); \
} while (0)

Pack a uint64_t to a known big-endian buffer.

Parameters
ptrPointer to the buffer into which to pack a uint64_t.
valuint64_t value to pack into the buffer.

◆ pack_64l

#define pack_64l (   ptr,
  val 
)
Value:
do \
{ \
((uint8_t *)(ptr))[0] = (uint8_t) ((val) & 0xff); \
((uint8_t *)(ptr))[1] = (uint8_t)(((val) & 0xff00) >> 8); \
((uint8_t *)(ptr))[2] = (uint8_t)(((val) & 0xff0000) >> 16); \
((uint8_t *)(ptr))[3] = (uint8_t)(((val) & 0xff000000) >> 24); \
((uint8_t *)(ptr))[4] = (uint8_t)(((val) & 0xff00000000) >> 32); \
((uint8_t *)(ptr))[5] = (uint8_t)(((val) & 0xff0000000000) >> 40); \
((uint8_t *)(ptr))[6] = (uint8_t)(((val) & 0xff000000000000) >> 48); \
((uint8_t *)(ptr))[7] = (uint8_t)(((val) & 0xff00000000000000) >> 56); \
} while (0)

Pack a uint64_t to a known little-endian buffer.

Parameters
ptrPointer to the buffer into which to pack a uint64_t.
valuint64_t value to pack into the buffer.

◆ upack_16b

#define upack_16b (   ptr)
Value:
(((uint16_t)0u) | \
(((uint16_t)((uint8_t *)(ptr))[0]) << 8) | \
((uint16_t)((uint8_t *)(ptr))[1]))

Unpack a uint16_t from a known big-endian buffer.

Parameters
ptrPointer to the buffer from which to unpack a uint16_t.
Returns
Unpacked uint16_t.

◆ upack_16l

#define upack_16l (   ptr)
Value:
(((uint16_t)0u) | \
(((uint16_t)((uint8_t *)(ptr))[1]) << 8) | \
((uint16_t)((uint8_t *)(ptr))[0]))

Unpack a uint16_t from a known little-endian buffer.

Parameters
ptrPointer to the buffer from which to unpack a uint16_t.
Returns
Unpacked uint16_t.

◆ upack_32b

#define upack_32b (   ptr)
Value:
(((uint32_t)0u) | \
(((uint32_t)((uint8_t *)(ptr))[0]) << 24) | \
(((uint32_t)((uint8_t *)(ptr))[1]) << 16) | \
(((uint32_t)((uint8_t *)(ptr))[2]) << 8) | \
((uint32_t)((uint8_t *)(ptr))[3]))

Unpack a uint32_t from a known big-endian buffer.

Parameters
ptrPointer to the buffer from which to unpack a uint32_t.
Returns
Unpacked uint32_t.

◆ upack_32l

#define upack_32l (   ptr)
Value:
(((uint32_t)0u) | \
(((uint32_t)((uint8_t *)(ptr))[3]) << 24) | \
(((uint32_t)((uint8_t *)(ptr))[2]) << 16) | \
(((uint32_t)((uint8_t *)(ptr))[1]) << 8) | \
((uint32_t)((uint8_t *)(ptr))[0]))

Unpack a uint32_t from a known little-endian buffer.

Parameters
ptrPointer to the buffer from which to unpack a uint32_t.
Returns
Unpacked uint32_t.

◆ upack_64b

#define upack_64b (   ptr)
Value:
(((uint64_t)0u) | \
(((uint64_t)((uint8_t *)(ptr))[0]) << 56) | \
(((uint64_t)((uint8_t *)(ptr))[1]) << 48) | \
(((uint64_t)((uint8_t *)(ptr))[2]) << 40) | \
(((uint64_t)((uint8_t *)(ptr))[3]) << 32) | \
(((uint64_t)((uint8_t *)(ptr))[4]) << 24) | \
(((uint64_t)((uint8_t *)(ptr))[5]) << 16) | \
(((uint64_t)((uint8_t *)(ptr))[6]) << 8) | \
((uint64_t)((uint8_t *)(ptr))[7]))

Unpack a uint64_t from a known big-endian buffer.

Parameters
ptrPointer to the buffer from which to unpack a uint64_t.
Returns
Unpacked uint64_t.

◆ upack_64l

#define upack_64l (   ptr)
Value:
(((uint64_t)0u) | \
(((uint64_t)((uint8_t *)(ptr))[7]) << 56) | \
(((uint64_t)((uint8_t *)(ptr))[6]) << 48) | \
(((uint64_t)((uint8_t *)(ptr))[5]) << 40) | \
(((uint64_t)((uint8_t *)(ptr))[4]) << 32) | \
(((uint64_t)((uint8_t *)(ptr))[3]) << 24) | \
(((uint64_t)((uint8_t *)(ptr))[2]) << 16) | \
(((uint64_t)((uint8_t *)(ptr))[1]) << 8) | \
((uint64_t)((uint8_t *)(ptr))[0]))

Unpack a uint64_t from a known little-endian buffer.

Parameters
ptrPointer to the buffer from which to unpack a uint64_t.
Returns
Unpacked uint64_t.