summaryrefslogtreecommitdiff
path: root/libmisc/include
diff options
context:
space:
mode:
Diffstat (limited to 'libmisc/include')
-rw-r--r--libmisc/include/libmisc/endian.h80
1 files changed, 79 insertions, 1 deletions
diff --git a/libmisc/include/libmisc/endian.h b/libmisc/include/libmisc/endian.h
index b1bc55c..665a8c8 100644
--- a/libmisc/include/libmisc/endian.h
+++ b/libmisc/include/libmisc/endian.h
@@ -1,6 +1,6 @@
/* libmisc/endian.h - Endian-conversion helpers
*
- * Copyright (C) 2024 Luke T. Shumaker <lukeshu@lukeshu.com>
+ * Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
@@ -71,6 +71,45 @@ static inline uint32_t uint32be_unmarshal(uint32be_t in) {
return uint32be_decode(in.octets);
}
+typedef struct {
+ uint8_t octets[8];
+} uint64be_t;
+static_assert(sizeof(uint64be_t) == 8);
+
+static inline size_t uint64be_encode(uint8_t *out, uint64_t in) {
+ out[0] = (uint8_t)((in >> 56) & 0xFF);
+ out[1] = (uint8_t)((in >> 48) & 0xFF);
+ out[2] = (uint8_t)((in >> 40) & 0xFF);
+ out[3] = (uint8_t)((in >> 32) & 0xFF);
+ out[4] = (uint8_t)((in >> 24) & 0xFF);
+ out[5] = (uint8_t)((in >> 16) & 0xFF);
+ out[6] = (uint8_t)((in >> 8) & 0xFF);
+ out[7] = (uint8_t)((in >> 0) & 0xFF);
+ return 8;
+}
+
+static inline uint64_t uint64be_decode(uint8_t *in) {
+ return (((uint64_t)(in[0])) << 56)
+ | (((uint64_t)(in[1])) << 48)
+ | (((uint64_t)(in[2])) << 40)
+ | (((uint64_t)(in[3])) << 32)
+ | (((uint64_t)(in[4])) << 24)
+ | (((uint64_t)(in[5])) << 16)
+ | (((uint64_t)(in[6])) << 8)
+ | (((uint64_t)(in[7])) << 0)
+ ;
+}
+
+static inline uint64be_t uint64be_marshal(uint64_t in) {
+ uint64be_t out;
+ uint64be_encode(out.octets, in);
+ return out;
+}
+
+static inline uint64_t uint64be_unmarshal(uint64be_t in) {
+ return uint64be_decode(in.octets);
+}
+
/* Little endian **************************************************************/
typedef struct {
@@ -131,4 +170,43 @@ static inline uint32_t uint32le_unmarshal(uint32le_t in) {
return uint32le_decode(in.octets);
}
+typedef struct {
+ uint8_t octets[8];
+} uint64le_t;
+static_assert(sizeof(uint64le_t) == 8);
+
+static inline size_t uint64le_encode(uint8_t *out, uint64_t in) {
+ out[0] = (uint8_t)((in >> 0) & 0xFF);
+ out[1] = (uint8_t)((in >> 8) & 0xFF);
+ out[2] = (uint8_t)((in >> 16) & 0xFF);
+ out[3] = (uint8_t)((in >> 24) & 0xFF);
+ out[4] = (uint8_t)((in >> 32) & 0xFF);
+ out[5] = (uint8_t)((in >> 40) & 0xFF);
+ out[6] = (uint8_t)((in >> 48) & 0xFF);
+ out[7] = (uint8_t)((in >> 56) & 0xFF);
+ return 8;
+}
+
+static inline uint64_t uint64le_decode(uint8_t *in) {
+ return (((uint64_t)(in[0])) << 0)
+ | (((uint64_t)(in[1])) << 8)
+ | (((uint64_t)(in[2])) << 16)
+ | (((uint64_t)(in[3])) << 24)
+ | (((uint64_t)(in[4])) << 32)
+ | (((uint64_t)(in[5])) << 40)
+ | (((uint64_t)(in[6])) << 48)
+ | (((uint64_t)(in[7])) << 56)
+ ;
+}
+
+static inline uint64le_t uint64le_marshal(uint64_t in) {
+ uint64le_t out;
+ uint64le_encode(out.octets, in);
+ return out;
+}
+
+static inline uint64_t uint64le_unmarshal(uint64le_t in) {
+ return uint64le_decode(in.octets);
+}
+
#endif /* _LIBMISC_ENDIAN_H_ */