bswap: add 64 bit endianness helper get_be64
Add a new get_be64 macro to enable 64 bit endian conversions on memory that may or may not be aligned. Signed-off-by: Ben Peart <benpeart@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Ben Peart committed
Sep 22, 2017 at 12:35 UTC
b2e39d0067240e262d77f6c2ac133b77c56bcf1c
1 file changed
+22
compat/bswap.h
+22
@@ -158,7 +158,9 @@ static inline uint64_t git_bswap64(uint64_t x)
158
159
#define get_be16(p) ntohs(*(unsigned short *)(p))
160
#define get_be32(p) ntohl(*(unsigned int *)(p))
161
+#define get_be64(p) ntohll(*(uint64_t *)(p))
162
#define put_be32(p, v) do { *(unsigned int *)(p) = htonl(v); } while (0)
163
+#define put_be64(p, v) do { *(uint64_t *)(p) = htonll(v); } while (0)
164
165
#else
166
@@ -178,6 +180,13 @@ static inline uint32_t get_be32(const void *ptr)
180
(uint32_t)p[3] << 0;
181
}
182
183
+static inline uint64_t get_be64(const void *ptr)
184
+{
185
+ const unsigned char *p = ptr;
186
+ return (uint64_t)get_be32(&p[0]) << 32 |
187
+ (uint64_t)get_be32(&p[4]) << 0;
188
+}
189
+
190
static inline void put_be32(void *ptr, uint32_t value)
191
{
192
unsigned char *p = ptr;
@@ -187,4 +196,17 @@ static inline void put_be32(void *ptr, uint32_t value)
196
p[3] = value >> 0;
197
}
198
199
+static inline void put_be64(void *ptr, uint64_t value)
200
+{
201
+ unsigned char *p = ptr;
202
+ p[0] = value >> 56;
203
+ p[1] = value >> 48;
204
+ p[2] = value >> 40;
205
+ p[3] = value >> 32;
206
+ p[4] = value >> 24;
207
+ p[5] = value >> 16;
208
+ p[6] = value >> 8;
209
+ p[7] = value >> 0;
210
+}
211
+
212
#endif