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.
|
#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...
|
|
◆ 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
-
ptr | Pointer to the buffer into which to pack a uint16_t. |
val | uint16_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
-
ptr | Pointer to the buffer into which to pack a uint16_t. |
val | uint16_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
-
ptr | Pointer to the buffer into which to pack a uint32_t. |
val | uint32_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
-
ptr | Pointer to the buffer into which to pack a uint32_t. |
val | uint32_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
-
ptr | Pointer to the buffer into which to pack a uint64_t. |
val | uint64_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
-
ptr | Pointer to the buffer into which to pack a uint64_t. |
val | uint64_t value to pack into the buffer. |
◆ upack_16b
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
-
ptr | Pointer to the buffer from which to unpack a uint16_t. |
- Returns
- Unpacked uint16_t.
◆ upack_16l
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
-
ptr | Pointer to the buffer from which to unpack a uint16_t. |
- Returns
- Unpacked uint16_t.
◆ upack_32b
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
-
ptr | Pointer to the buffer from which to unpack a uint32_t. |
- Returns
- Unpacked uint32_t.
◆ upack_32l
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
-
ptr | Pointer to the buffer from which to unpack a uint32_t. |
- Returns
- Unpacked uint32_t.
◆ upack_64b
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
-
ptr | Pointer to the buffer from which to unpack a uint64_t. |
- Returns
- Unpacked uint64_t.
◆ upack_64l
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
-
ptr | Pointer to the buffer from which to unpack a uint64_t. |
- Returns
- Unpacked uint64_t.