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