xref: /aosp_15_r20/external/webrtc/rtc_base/byte_order.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef RTC_BASE_BYTE_ORDER_H_
12*d9f75844SAndroid Build Coastguard Worker #define RTC_BASE_BYTE_ORDER_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <stdint.h>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include <cstring>
17*d9f75844SAndroid Build Coastguard Worker 
18*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_POSIX) && !defined(__native_client__)
19*d9f75844SAndroid Build Coastguard Worker #include <arpa/inet.h>
20*d9f75844SAndroid Build Coastguard Worker #endif
21*d9f75844SAndroid Build Coastguard Worker 
22*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/system/arch.h"
23*d9f75844SAndroid Build Coastguard Worker 
24*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_MAC)
25*d9f75844SAndroid Build Coastguard Worker #include <libkern/OSByteOrder.h>
26*d9f75844SAndroid Build Coastguard Worker 
27*d9f75844SAndroid Build Coastguard Worker #define htobe16(v) OSSwapHostToBigInt16(v)
28*d9f75844SAndroid Build Coastguard Worker #define htobe32(v) OSSwapHostToBigInt32(v)
29*d9f75844SAndroid Build Coastguard Worker #define htobe64(v) OSSwapHostToBigInt64(v)
30*d9f75844SAndroid Build Coastguard Worker #define be16toh(v) OSSwapBigToHostInt16(v)
31*d9f75844SAndroid Build Coastguard Worker #define be32toh(v) OSSwapBigToHostInt32(v)
32*d9f75844SAndroid Build Coastguard Worker #define be64toh(v) OSSwapBigToHostInt64(v)
33*d9f75844SAndroid Build Coastguard Worker 
34*d9f75844SAndroid Build Coastguard Worker #define htole16(v) OSSwapHostToLittleInt16(v)
35*d9f75844SAndroid Build Coastguard Worker #define htole32(v) OSSwapHostToLittleInt32(v)
36*d9f75844SAndroid Build Coastguard Worker #define htole64(v) OSSwapHostToLittleInt64(v)
37*d9f75844SAndroid Build Coastguard Worker #define le16toh(v) OSSwapLittleToHostInt16(v)
38*d9f75844SAndroid Build Coastguard Worker #define le32toh(v) OSSwapLittleToHostInt32(v)
39*d9f75844SAndroid Build Coastguard Worker #define le64toh(v) OSSwapLittleToHostInt64(v)
40*d9f75844SAndroid Build Coastguard Worker 
41*d9f75844SAndroid Build Coastguard Worker #elif defined(WEBRTC_WIN) || defined(__native_client__)
42*d9f75844SAndroid Build Coastguard Worker 
43*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_WIN)
44*d9f75844SAndroid Build Coastguard Worker #include <stdlib.h>
45*d9f75844SAndroid Build Coastguard Worker #include <winsock2.h>
46*d9f75844SAndroid Build Coastguard Worker #else
47*d9f75844SAndroid Build Coastguard Worker #include <netinet/in.h>
48*d9f75844SAndroid Build Coastguard Worker #endif  // defined(WEBRTC_WIN)
49*d9f75844SAndroid Build Coastguard Worker 
50*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_ARCH_LITTLE_ENDIAN)
51*d9f75844SAndroid Build Coastguard Worker #define htobe16(v) htons(v)
52*d9f75844SAndroid Build Coastguard Worker #define htobe32(v) htonl(v)
53*d9f75844SAndroid Build Coastguard Worker #define be16toh(v) ntohs(v)
54*d9f75844SAndroid Build Coastguard Worker #define be32toh(v) ntohl(v)
55*d9f75844SAndroid Build Coastguard Worker #define htole16(v) (v)
56*d9f75844SAndroid Build Coastguard Worker #define htole32(v) (v)
57*d9f75844SAndroid Build Coastguard Worker #define htole64(v) (v)
58*d9f75844SAndroid Build Coastguard Worker #define le16toh(v) (v)
59*d9f75844SAndroid Build Coastguard Worker #define le32toh(v) (v)
60*d9f75844SAndroid Build Coastguard Worker #define le64toh(v) (v)
61*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_WIN)
62*d9f75844SAndroid Build Coastguard Worker #define htobe64(v) _byteswap_uint64(v)
63*d9f75844SAndroid Build Coastguard Worker #define be64toh(v) _byteswap_uint64(v)
64*d9f75844SAndroid Build Coastguard Worker #endif  // defined(WEBRTC_WIN)
65*d9f75844SAndroid Build Coastguard Worker #if defined(__native_client__)
66*d9f75844SAndroid Build Coastguard Worker #define htobe64(v) __builtin_bswap64(v)
67*d9f75844SAndroid Build Coastguard Worker #define be64toh(v) __builtin_bswap64(v)
68*d9f75844SAndroid Build Coastguard Worker #endif  // defined(__native_client__)
69*d9f75844SAndroid Build Coastguard Worker 
70*d9f75844SAndroid Build Coastguard Worker #elif defined(WEBRTC_ARCH_BIG_ENDIAN)
71*d9f75844SAndroid Build Coastguard Worker #define htobe16(v) (v)
72*d9f75844SAndroid Build Coastguard Worker #define htobe32(v) (v)
73*d9f75844SAndroid Build Coastguard Worker #define be16toh(v) (v)
74*d9f75844SAndroid Build Coastguard Worker #define be32toh(v) (v)
75*d9f75844SAndroid Build Coastguard Worker #define htole16(v) __builtin_bswap16(v)
76*d9f75844SAndroid Build Coastguard Worker #define htole32(v) __builtin_bswap32(v)
77*d9f75844SAndroid Build Coastguard Worker #define htole64(v) __builtin_bswap64(v)
78*d9f75844SAndroid Build Coastguard Worker #define le16toh(v) __builtin_bswap16(v)
79*d9f75844SAndroid Build Coastguard Worker #define le32toh(v) __builtin_bswap32(v)
80*d9f75844SAndroid Build Coastguard Worker #define le64toh(v) __builtin_bswap64(v)
81*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_WIN)
82*d9f75844SAndroid Build Coastguard Worker #define htobe64(v) (v)
83*d9f75844SAndroid Build Coastguard Worker #define be64toh(v) (v)
84*d9f75844SAndroid Build Coastguard Worker #endif  // defined(WEBRTC_WIN)
85*d9f75844SAndroid Build Coastguard Worker #if defined(__native_client__)
86*d9f75844SAndroid Build Coastguard Worker #define htobe64(v) (v)
87*d9f75844SAndroid Build Coastguard Worker #define be64toh(v) (v)
88*d9f75844SAndroid Build Coastguard Worker #endif  // defined(__native_client__)
89*d9f75844SAndroid Build Coastguard Worker #else
90*d9f75844SAndroid Build Coastguard Worker #error WEBRTC_ARCH_BIG_ENDIAN or WEBRTC_ARCH_LITTLE_ENDIAN must be defined.
91*d9f75844SAndroid Build Coastguard Worker #endif  // defined(WEBRTC_ARCH_LITTLE_ENDIAN)
92*d9f75844SAndroid Build Coastguard Worker 
93*d9f75844SAndroid Build Coastguard Worker #elif defined(WEBRTC_POSIX)
94*d9f75844SAndroid Build Coastguard Worker #include <endian.h>
95*d9f75844SAndroid Build Coastguard Worker #else
96*d9f75844SAndroid Build Coastguard Worker #error "Missing byte order functions for this arch."
97*d9f75844SAndroid Build Coastguard Worker #endif  // defined(WEBRTC_MAC)
98*d9f75844SAndroid Build Coastguard Worker 
99*d9f75844SAndroid Build Coastguard Worker namespace rtc {
100*d9f75844SAndroid Build Coastguard Worker 
101*d9f75844SAndroid Build Coastguard Worker // Reading and writing of little and big-endian numbers from memory
102*d9f75844SAndroid Build Coastguard Worker 
Set8(void * memory,size_t offset,uint8_t v)103*d9f75844SAndroid Build Coastguard Worker inline void Set8(void* memory, size_t offset, uint8_t v) {
104*d9f75844SAndroid Build Coastguard Worker   static_cast<uint8_t*>(memory)[offset] = v;
105*d9f75844SAndroid Build Coastguard Worker }
106*d9f75844SAndroid Build Coastguard Worker 
Get8(const void * memory,size_t offset)107*d9f75844SAndroid Build Coastguard Worker inline uint8_t Get8(const void* memory, size_t offset) {
108*d9f75844SAndroid Build Coastguard Worker   return static_cast<const uint8_t*>(memory)[offset];
109*d9f75844SAndroid Build Coastguard Worker }
110*d9f75844SAndroid Build Coastguard Worker 
SetBE16(void * memory,uint16_t v)111*d9f75844SAndroid Build Coastguard Worker inline void SetBE16(void* memory, uint16_t v) {
112*d9f75844SAndroid Build Coastguard Worker   uint16_t val = htobe16(v);
113*d9f75844SAndroid Build Coastguard Worker   memcpy(memory, &val, sizeof(val));
114*d9f75844SAndroid Build Coastguard Worker }
115*d9f75844SAndroid Build Coastguard Worker 
SetBE32(void * memory,uint32_t v)116*d9f75844SAndroid Build Coastguard Worker inline void SetBE32(void* memory, uint32_t v) {
117*d9f75844SAndroid Build Coastguard Worker   uint32_t val = htobe32(v);
118*d9f75844SAndroid Build Coastguard Worker   memcpy(memory, &val, sizeof(val));
119*d9f75844SAndroid Build Coastguard Worker }
120*d9f75844SAndroid Build Coastguard Worker 
SetBE64(void * memory,uint64_t v)121*d9f75844SAndroid Build Coastguard Worker inline void SetBE64(void* memory, uint64_t v) {
122*d9f75844SAndroid Build Coastguard Worker   uint64_t val = htobe64(v);
123*d9f75844SAndroid Build Coastguard Worker   memcpy(memory, &val, sizeof(val));
124*d9f75844SAndroid Build Coastguard Worker }
125*d9f75844SAndroid Build Coastguard Worker 
GetBE16(const void * memory)126*d9f75844SAndroid Build Coastguard Worker inline uint16_t GetBE16(const void* memory) {
127*d9f75844SAndroid Build Coastguard Worker   uint16_t val;
128*d9f75844SAndroid Build Coastguard Worker   memcpy(&val, memory, sizeof(val));
129*d9f75844SAndroid Build Coastguard Worker   return be16toh(val);
130*d9f75844SAndroid Build Coastguard Worker }
131*d9f75844SAndroid Build Coastguard Worker 
GetBE32(const void * memory)132*d9f75844SAndroid Build Coastguard Worker inline uint32_t GetBE32(const void* memory) {
133*d9f75844SAndroid Build Coastguard Worker   uint32_t val;
134*d9f75844SAndroid Build Coastguard Worker   memcpy(&val, memory, sizeof(val));
135*d9f75844SAndroid Build Coastguard Worker   return be32toh(val);
136*d9f75844SAndroid Build Coastguard Worker }
137*d9f75844SAndroid Build Coastguard Worker 
GetBE64(const void * memory)138*d9f75844SAndroid Build Coastguard Worker inline uint64_t GetBE64(const void* memory) {
139*d9f75844SAndroid Build Coastguard Worker   uint64_t val;
140*d9f75844SAndroid Build Coastguard Worker   memcpy(&val, memory, sizeof(val));
141*d9f75844SAndroid Build Coastguard Worker   return be64toh(val);
142*d9f75844SAndroid Build Coastguard Worker }
143*d9f75844SAndroid Build Coastguard Worker 
SetLE16(void * memory,uint16_t v)144*d9f75844SAndroid Build Coastguard Worker inline void SetLE16(void* memory, uint16_t v) {
145*d9f75844SAndroid Build Coastguard Worker   uint16_t val = htole16(v);
146*d9f75844SAndroid Build Coastguard Worker   memcpy(memory, &val, sizeof(val));
147*d9f75844SAndroid Build Coastguard Worker }
148*d9f75844SAndroid Build Coastguard Worker 
SetLE32(void * memory,uint32_t v)149*d9f75844SAndroid Build Coastguard Worker inline void SetLE32(void* memory, uint32_t v) {
150*d9f75844SAndroid Build Coastguard Worker   uint32_t val = htole32(v);
151*d9f75844SAndroid Build Coastguard Worker   memcpy(memory, &val, sizeof(val));
152*d9f75844SAndroid Build Coastguard Worker }
153*d9f75844SAndroid Build Coastguard Worker 
SetLE64(void * memory,uint64_t v)154*d9f75844SAndroid Build Coastguard Worker inline void SetLE64(void* memory, uint64_t v) {
155*d9f75844SAndroid Build Coastguard Worker   uint64_t val = htole64(v);
156*d9f75844SAndroid Build Coastguard Worker   memcpy(memory, &val, sizeof(val));
157*d9f75844SAndroid Build Coastguard Worker }
158*d9f75844SAndroid Build Coastguard Worker 
GetLE16(const void * memory)159*d9f75844SAndroid Build Coastguard Worker inline uint16_t GetLE16(const void* memory) {
160*d9f75844SAndroid Build Coastguard Worker   uint16_t val;
161*d9f75844SAndroid Build Coastguard Worker   memcpy(&val, memory, sizeof(val));
162*d9f75844SAndroid Build Coastguard Worker   return le16toh(val);
163*d9f75844SAndroid Build Coastguard Worker }
164*d9f75844SAndroid Build Coastguard Worker 
GetLE32(const void * memory)165*d9f75844SAndroid Build Coastguard Worker inline uint32_t GetLE32(const void* memory) {
166*d9f75844SAndroid Build Coastguard Worker   uint32_t val;
167*d9f75844SAndroid Build Coastguard Worker   memcpy(&val, memory, sizeof(val));
168*d9f75844SAndroid Build Coastguard Worker   return le32toh(val);
169*d9f75844SAndroid Build Coastguard Worker }
170*d9f75844SAndroid Build Coastguard Worker 
GetLE64(const void * memory)171*d9f75844SAndroid Build Coastguard Worker inline uint64_t GetLE64(const void* memory) {
172*d9f75844SAndroid Build Coastguard Worker   uint64_t val;
173*d9f75844SAndroid Build Coastguard Worker   memcpy(&val, memory, sizeof(val));
174*d9f75844SAndroid Build Coastguard Worker   return le64toh(val);
175*d9f75844SAndroid Build Coastguard Worker }
176*d9f75844SAndroid Build Coastguard Worker 
177*d9f75844SAndroid Build Coastguard Worker // Check if the current host is big endian.
IsHostBigEndian()178*d9f75844SAndroid Build Coastguard Worker inline bool IsHostBigEndian() {
179*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_ARCH_BIG_ENDIAN)
180*d9f75844SAndroid Build Coastguard Worker   return true;
181*d9f75844SAndroid Build Coastguard Worker #else
182*d9f75844SAndroid Build Coastguard Worker   return false;
183*d9f75844SAndroid Build Coastguard Worker #endif
184*d9f75844SAndroid Build Coastguard Worker }
185*d9f75844SAndroid Build Coastguard Worker 
HostToNetwork16(uint16_t n)186*d9f75844SAndroid Build Coastguard Worker inline uint16_t HostToNetwork16(uint16_t n) {
187*d9f75844SAndroid Build Coastguard Worker   return htobe16(n);
188*d9f75844SAndroid Build Coastguard Worker }
189*d9f75844SAndroid Build Coastguard Worker 
HostToNetwork32(uint32_t n)190*d9f75844SAndroid Build Coastguard Worker inline uint32_t HostToNetwork32(uint32_t n) {
191*d9f75844SAndroid Build Coastguard Worker   return htobe32(n);
192*d9f75844SAndroid Build Coastguard Worker }
193*d9f75844SAndroid Build Coastguard Worker 
HostToNetwork64(uint64_t n)194*d9f75844SAndroid Build Coastguard Worker inline uint64_t HostToNetwork64(uint64_t n) {
195*d9f75844SAndroid Build Coastguard Worker   return htobe64(n);
196*d9f75844SAndroid Build Coastguard Worker }
197*d9f75844SAndroid Build Coastguard Worker 
NetworkToHost16(uint16_t n)198*d9f75844SAndroid Build Coastguard Worker inline uint16_t NetworkToHost16(uint16_t n) {
199*d9f75844SAndroid Build Coastguard Worker   return be16toh(n);
200*d9f75844SAndroid Build Coastguard Worker }
201*d9f75844SAndroid Build Coastguard Worker 
NetworkToHost32(uint32_t n)202*d9f75844SAndroid Build Coastguard Worker inline uint32_t NetworkToHost32(uint32_t n) {
203*d9f75844SAndroid Build Coastguard Worker   return be32toh(n);
204*d9f75844SAndroid Build Coastguard Worker }
205*d9f75844SAndroid Build Coastguard Worker 
NetworkToHost64(uint64_t n)206*d9f75844SAndroid Build Coastguard Worker inline uint64_t NetworkToHost64(uint64_t n) {
207*d9f75844SAndroid Build Coastguard Worker   return be64toh(n);
208*d9f75844SAndroid Build Coastguard Worker }
209*d9f75844SAndroid Build Coastguard Worker 
210*d9f75844SAndroid Build Coastguard Worker }  // namespace rtc
211*d9f75844SAndroid Build Coastguard Worker 
212*d9f75844SAndroid Build Coastguard Worker #endif  // RTC_BASE_BYTE_ORDER_H_
213