blob: d0cfa5e48e5b1a8751b09fe0946467327b7cf452 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_BASE_BYTEORDER_H_
12#define WEBRTC_BASE_BYTEORDER_H_
13
14#if defined(WEBRTC_POSIX) && !defined(__native_client__)
15#include <arpa/inet.h>
16#endif
17
jbauch5533bd32017-03-31 01:42:09 -070018#include "webrtc/base/basictypes.h"
19
20#if defined(WEBRTC_MAC)
21#include <libkern/OSByteOrder.h>
22
23#define htobe16(v) OSSwapHostToBigInt16(v)
24#define htobe32(v) OSSwapHostToBigInt32(v)
25#define htobe64(v) OSSwapHostToBigInt64(v)
26#define be16toh(v) OSSwapBigToHostInt16(v)
27#define be32toh(v) OSSwapBigToHostInt32(v)
28#define be64toh(v) OSSwapBigToHostInt64(v)
29
30#define htole16(v) OSSwapHostToLittleInt16(v)
31#define htole32(v) OSSwapHostToLittleInt32(v)
32#define htole64(v) OSSwapHostToLittleInt64(v)
33#define le16toh(v) OSSwapLittleToHostInt16(v)
34#define le32toh(v) OSSwapLittleToHostInt32(v)
35#define le64toh(v) OSSwapLittleToHostInt64(v)
36#elif defined(WEBRTC_WIN) || defined(__native_client__)
37
jbauch8f05ab22017-03-16 10:34:37 -070038#if defined(WEBRTC_WIN)
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000039#include <stdlib.h>
jbauch5533bd32017-03-31 01:42:09 -070040#include <winsock2.h>
41#else
42#include <netinet/in.h>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000043#endif
44
jbauch5533bd32017-03-31 01:42:09 -070045#define htobe16(v) htons(v)
46#define htobe32(v) htonl(v)
47#define be16toh(v) ntohs(v)
48#define be32toh(v) ntohl(v)
49#if defined(WEBRTC_WIN)
50#define htobe64(v) htonll(v)
51#define be64toh(v) ntohll(v)
52#endif
53
54#if defined(RTC_ARCH_CPU_LITTLE_ENDIAN)
55#define htole16(v) (v)
56#define htole32(v) (v)
57#define htole64(v) (v)
58#define le16toh(v) (v)
59#define le32toh(v) (v)
60#define le64toh(v) (v)
61#if defined(__native_client__)
62#define htobe64(v) __builtin_bswap64(v)
63#define be64toh(v) __builtin_bswap64(v)
64#endif
65#elif defined(RTC_ARCH_CPU_BIG_ENDIAN)
66#define htole16(v) __builtin_bswap16(v)
67#define htole32(v) __builtin_bswap32(v)
68#define htole64(v) __builtin_bswap64(v)
69#define le16toh(v) __builtin_bswap16(v)
70#define le32toh(v) __builtin_bswap32(v)
71#define le64toh(v) __builtin_bswap64(v)
72#if defined(__native_client__)
73#define htobe64(v) (v)
74#define be64toh(v) (v)
75#endif
76#else
77#error RTC_ARCH_CPU_BIG_ENDIAN or RTC_ARCH_CPU_LITTLE_ENDIAN must be defined.
78#endif // defined(RTC_ARCH_CPU_LITTLE_ENDIAN)
79#elif defined(WEBRTC_POSIX)
80#include <endian.h>
81#endif
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000082
83namespace rtc {
84
85// Reading and writing of little and big-endian numbers from memory
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000086
Peter Boström0c4e06b2015-10-07 12:23:21 +020087inline void Set8(void* memory, size_t offset, uint8_t v) {
88 static_cast<uint8_t*>(memory)[offset] = v;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000089}
90
Peter Boström0c4e06b2015-10-07 12:23:21 +020091inline uint8_t Get8(const void* memory, size_t offset) {
92 return static_cast<const uint8_t*>(memory)[offset];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000093}
94
Peter Boström0c4e06b2015-10-07 12:23:21 +020095inline void SetBE16(void* memory, uint16_t v) {
jbauch5533bd32017-03-31 01:42:09 -070096 *static_cast<uint16_t*>(memory) = htobe16(v);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000097}
98
Peter Boström0c4e06b2015-10-07 12:23:21 +020099inline void SetBE32(void* memory, uint32_t v) {
jbauch5533bd32017-03-31 01:42:09 -0700100 *static_cast<uint32_t*>(memory) = htobe32(v);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000101}
102
Peter Boström0c4e06b2015-10-07 12:23:21 +0200103inline void SetBE64(void* memory, uint64_t v) {
jbauch5533bd32017-03-31 01:42:09 -0700104 *static_cast<uint64_t*>(memory) = htobe64(v);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000105}
106
Peter Boström0c4e06b2015-10-07 12:23:21 +0200107inline uint16_t GetBE16(const void* memory) {
jbauch5533bd32017-03-31 01:42:09 -0700108 return be16toh(*static_cast<const uint16_t*>(memory));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000109}
110
Peter Boström0c4e06b2015-10-07 12:23:21 +0200111inline uint32_t GetBE32(const void* memory) {
jbauch5533bd32017-03-31 01:42:09 -0700112 return be32toh(*static_cast<const uint32_t*>(memory));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000113}
114
Peter Boström0c4e06b2015-10-07 12:23:21 +0200115inline uint64_t GetBE64(const void* memory) {
jbauch5533bd32017-03-31 01:42:09 -0700116 return be64toh(*static_cast<const uint64_t*>(memory));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000117}
118
Peter Boström0c4e06b2015-10-07 12:23:21 +0200119inline void SetLE16(void* memory, uint16_t v) {
jbauch5533bd32017-03-31 01:42:09 -0700120 *static_cast<uint16_t*>(memory) = htole16(v);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000121}
122
Peter Boström0c4e06b2015-10-07 12:23:21 +0200123inline void SetLE32(void* memory, uint32_t v) {
jbauch5533bd32017-03-31 01:42:09 -0700124 *static_cast<uint32_t*>(memory) = htole32(v);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000125}
126
Peter Boström0c4e06b2015-10-07 12:23:21 +0200127inline void SetLE64(void* memory, uint64_t v) {
jbauch5533bd32017-03-31 01:42:09 -0700128 *static_cast<uint64_t*>(memory) = htole64(v);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000129}
130
Peter Boström0c4e06b2015-10-07 12:23:21 +0200131inline uint16_t GetLE16(const void* memory) {
jbauch5533bd32017-03-31 01:42:09 -0700132 return le16toh(*static_cast<const uint16_t*>(memory));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000133}
134
Peter Boström0c4e06b2015-10-07 12:23:21 +0200135inline uint32_t GetLE32(const void* memory) {
jbauch5533bd32017-03-31 01:42:09 -0700136 return le32toh(*static_cast<const uint32_t*>(memory));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000137}
138
Peter Boström0c4e06b2015-10-07 12:23:21 +0200139inline uint64_t GetLE64(const void* memory) {
jbauch5533bd32017-03-31 01:42:09 -0700140 return le64toh(*static_cast<const uint64_t*>(memory));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000141}
142
143// Check if the current host is big endian.
144inline bool IsHostBigEndian() {
jbauch5533bd32017-03-31 01:42:09 -0700145#if defined(RTC_ARCH_CPU_BIG_ENDIAN)
146 return true;
147#else
148 return false;
149#endif
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000150}
151
Peter Boström0c4e06b2015-10-07 12:23:21 +0200152inline uint16_t HostToNetwork16(uint16_t n) {
jbauch5533bd32017-03-31 01:42:09 -0700153 return htobe16(n);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000154}
155
Peter Boström0c4e06b2015-10-07 12:23:21 +0200156inline uint32_t HostToNetwork32(uint32_t n) {
jbauch5533bd32017-03-31 01:42:09 -0700157 return htobe32(n);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000158}
159
Peter Boström0c4e06b2015-10-07 12:23:21 +0200160inline uint64_t HostToNetwork64(uint64_t n) {
jbauch5533bd32017-03-31 01:42:09 -0700161 return htobe64(n);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000162}
163
Peter Boström0c4e06b2015-10-07 12:23:21 +0200164inline uint16_t NetworkToHost16(uint16_t n) {
jbauch5533bd32017-03-31 01:42:09 -0700165 return be16toh(n);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000166}
167
Peter Boström0c4e06b2015-10-07 12:23:21 +0200168inline uint32_t NetworkToHost32(uint32_t n) {
jbauch5533bd32017-03-31 01:42:09 -0700169 return be32toh(n);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000170}
171
Peter Boström0c4e06b2015-10-07 12:23:21 +0200172inline uint64_t NetworkToHost64(uint64_t n) {
jbauch5533bd32017-03-31 01:42:09 -0700173 return be64toh(n);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000174}
175
176} // namespace rtc
177
178#endif // WEBRTC_BASE_BYTEORDER_H_