OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #ifndef WEBRTC_BASE_BYTEORDER_H_ | 11 #ifndef WEBRTC_BASE_BYTEORDER_H_ |
12 #define WEBRTC_BASE_BYTEORDER_H_ | 12 #define WEBRTC_BASE_BYTEORDER_H_ |
13 | 13 |
14 #if defined(WEBRTC_POSIX) && !defined(__native_client__) | 14 #if defined(WEBRTC_POSIX) && !defined(__native_client__) |
15 #include <arpa/inet.h> | 15 #include <arpa/inet.h> |
16 #endif | 16 #endif |
17 | 17 |
18 #if defined(WEBRTC_WIN) | |
19 #include <stdlib.h> | |
20 #endif | |
21 | |
22 #include "webrtc/base/basictypes.h" | 18 #include "webrtc/base/basictypes.h" |
23 | 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 |
| 38 #if defined(WEBRTC_WIN) |
| 39 #include <stdlib.h> |
| 40 #include <winsock2.h> |
| 41 #else |
| 42 #include <netinet/in.h> |
| 43 #endif |
| 44 |
| 45 #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 |
| 82 |
24 namespace rtc { | 83 namespace rtc { |
25 | 84 |
26 // Reading and writing of little and big-endian numbers from memory | 85 // Reading and writing of little and big-endian numbers from memory |
27 // TODO: Optimized versions, with direct read/writes of | |
28 // integers in host-endian format, when the platform supports it. | |
29 | 86 |
30 inline void Set8(void* memory, size_t offset, uint8_t v) { | 87 inline void Set8(void* memory, size_t offset, uint8_t v) { |
31 static_cast<uint8_t*>(memory)[offset] = v; | 88 static_cast<uint8_t*>(memory)[offset] = v; |
32 } | 89 } |
33 | 90 |
34 inline uint8_t Get8(const void* memory, size_t offset) { | 91 inline uint8_t Get8(const void* memory, size_t offset) { |
35 return static_cast<const uint8_t*>(memory)[offset]; | 92 return static_cast<const uint8_t*>(memory)[offset]; |
36 } | 93 } |
37 | 94 |
38 inline void SetBE16(void* memory, uint16_t v) { | 95 inline void SetBE16(void* memory, uint16_t v) { |
39 Set8(memory, 0, static_cast<uint8_t>(v >> 8)); | 96 *static_cast<uint16_t*>(memory) = htobe16(v); |
40 Set8(memory, 1, static_cast<uint8_t>(v >> 0)); | |
41 } | 97 } |
42 | 98 |
43 inline void SetBE32(void* memory, uint32_t v) { | 99 inline void SetBE32(void* memory, uint32_t v) { |
44 Set8(memory, 0, static_cast<uint8_t>(v >> 24)); | 100 *static_cast<uint32_t*>(memory) = htobe32(v); |
45 Set8(memory, 1, static_cast<uint8_t>(v >> 16)); | |
46 Set8(memory, 2, static_cast<uint8_t>(v >> 8)); | |
47 Set8(memory, 3, static_cast<uint8_t>(v >> 0)); | |
48 } | 101 } |
49 | 102 |
50 inline void SetBE64(void* memory, uint64_t v) { | 103 inline void SetBE64(void* memory, uint64_t v) { |
51 Set8(memory, 0, static_cast<uint8_t>(v >> 56)); | 104 *static_cast<uint64_t*>(memory) = htobe64(v); |
52 Set8(memory, 1, static_cast<uint8_t>(v >> 48)); | |
53 Set8(memory, 2, static_cast<uint8_t>(v >> 40)); | |
54 Set8(memory, 3, static_cast<uint8_t>(v >> 32)); | |
55 Set8(memory, 4, static_cast<uint8_t>(v >> 24)); | |
56 Set8(memory, 5, static_cast<uint8_t>(v >> 16)); | |
57 Set8(memory, 6, static_cast<uint8_t>(v >> 8)); | |
58 Set8(memory, 7, static_cast<uint8_t>(v >> 0)); | |
59 } | 105 } |
60 | 106 |
61 inline uint16_t GetBE16(const void* memory) { | 107 inline uint16_t GetBE16(const void* memory) { |
62 return static_cast<uint16_t>((Get8(memory, 0) << 8) | (Get8(memory, 1) << 0)); | 108 return be16toh(*static_cast<const uint16_t*>(memory)); |
63 } | 109 } |
64 | 110 |
65 inline uint32_t GetBE32(const void* memory) { | 111 inline uint32_t GetBE32(const void* memory) { |
66 return (static_cast<uint32_t>(Get8(memory, 0)) << 24) | | 112 return be32toh(*static_cast<const uint32_t*>(memory)); |
67 (static_cast<uint32_t>(Get8(memory, 1)) << 16) | | |
68 (static_cast<uint32_t>(Get8(memory, 2)) << 8) | | |
69 (static_cast<uint32_t>(Get8(memory, 3)) << 0); | |
70 } | 113 } |
71 | 114 |
72 inline uint64_t GetBE64(const void* memory) { | 115 inline uint64_t GetBE64(const void* memory) { |
73 return (static_cast<uint64_t>(Get8(memory, 0)) << 56) | | 116 return be64toh(*static_cast<const uint64_t*>(memory)); |
74 (static_cast<uint64_t>(Get8(memory, 1)) << 48) | | |
75 (static_cast<uint64_t>(Get8(memory, 2)) << 40) | | |
76 (static_cast<uint64_t>(Get8(memory, 3)) << 32) | | |
77 (static_cast<uint64_t>(Get8(memory, 4)) << 24) | | |
78 (static_cast<uint64_t>(Get8(memory, 5)) << 16) | | |
79 (static_cast<uint64_t>(Get8(memory, 6)) << 8) | | |
80 (static_cast<uint64_t>(Get8(memory, 7)) << 0); | |
81 } | 117 } |
82 | 118 |
83 inline void SetLE16(void* memory, uint16_t v) { | 119 inline void SetLE16(void* memory, uint16_t v) { |
84 Set8(memory, 0, static_cast<uint8_t>(v >> 0)); | 120 *static_cast<uint16_t*>(memory) = htole16(v); |
85 Set8(memory, 1, static_cast<uint8_t>(v >> 8)); | |
86 } | 121 } |
87 | 122 |
88 inline void SetLE32(void* memory, uint32_t v) { | 123 inline void SetLE32(void* memory, uint32_t v) { |
89 Set8(memory, 0, static_cast<uint8_t>(v >> 0)); | 124 *static_cast<uint32_t*>(memory) = htole32(v); |
90 Set8(memory, 1, static_cast<uint8_t>(v >> 8)); | |
91 Set8(memory, 2, static_cast<uint8_t>(v >> 16)); | |
92 Set8(memory, 3, static_cast<uint8_t>(v >> 24)); | |
93 } | 125 } |
94 | 126 |
95 inline void SetLE64(void* memory, uint64_t v) { | 127 inline void SetLE64(void* memory, uint64_t v) { |
96 Set8(memory, 0, static_cast<uint8_t>(v >> 0)); | 128 *static_cast<uint64_t*>(memory) = htole64(v); |
97 Set8(memory, 1, static_cast<uint8_t>(v >> 8)); | |
98 Set8(memory, 2, static_cast<uint8_t>(v >> 16)); | |
99 Set8(memory, 3, static_cast<uint8_t>(v >> 24)); | |
100 Set8(memory, 4, static_cast<uint8_t>(v >> 32)); | |
101 Set8(memory, 5, static_cast<uint8_t>(v >> 40)); | |
102 Set8(memory, 6, static_cast<uint8_t>(v >> 48)); | |
103 Set8(memory, 7, static_cast<uint8_t>(v >> 56)); | |
104 } | 129 } |
105 | 130 |
106 inline uint16_t GetLE16(const void* memory) { | 131 inline uint16_t GetLE16(const void* memory) { |
107 return static_cast<uint16_t>((Get8(memory, 0) << 0) | (Get8(memory, 1) << 8)); | 132 return le16toh(*static_cast<const uint16_t*>(memory)); |
108 } | 133 } |
109 | 134 |
110 inline uint32_t GetLE32(const void* memory) { | 135 inline uint32_t GetLE32(const void* memory) { |
111 return (static_cast<uint32_t>(Get8(memory, 0)) << 0) | | 136 return le32toh(*static_cast<const uint32_t*>(memory)); |
112 (static_cast<uint32_t>(Get8(memory, 1)) << 8) | | |
113 (static_cast<uint32_t>(Get8(memory, 2)) << 16) | | |
114 (static_cast<uint32_t>(Get8(memory, 3)) << 24); | |
115 } | 137 } |
116 | 138 |
117 inline uint64_t GetLE64(const void* memory) { | 139 inline uint64_t GetLE64(const void* memory) { |
118 return (static_cast<uint64_t>(Get8(memory, 0)) << 0) | | 140 return le64toh(*static_cast<const uint64_t*>(memory)); |
119 (static_cast<uint64_t>(Get8(memory, 1)) << 8) | | |
120 (static_cast<uint64_t>(Get8(memory, 2)) << 16) | | |
121 (static_cast<uint64_t>(Get8(memory, 3)) << 24) | | |
122 (static_cast<uint64_t>(Get8(memory, 4)) << 32) | | |
123 (static_cast<uint64_t>(Get8(memory, 5)) << 40) | | |
124 (static_cast<uint64_t>(Get8(memory, 6)) << 48) | | |
125 (static_cast<uint64_t>(Get8(memory, 7)) << 56); | |
126 } | 141 } |
127 | 142 |
128 // Check if the current host is big endian. | 143 // Check if the current host is big endian. |
129 inline bool IsHostBigEndian() { | 144 inline bool IsHostBigEndian() { |
130 static const int number = 1; | 145 #if defined(RTC_ARCH_CPU_BIG_ENDIAN) |
131 return 0 == *reinterpret_cast<const char*>(&number); | 146 return true; |
| 147 #else |
| 148 return false; |
| 149 #endif |
132 } | 150 } |
133 | 151 |
134 inline uint16_t HostToNetwork16(uint16_t n) { | 152 inline uint16_t HostToNetwork16(uint16_t n) { |
135 uint16_t result; | 153 return htobe16(n); |
136 SetBE16(&result, n); | |
137 return result; | |
138 } | 154 } |
139 | 155 |
140 inline uint32_t HostToNetwork32(uint32_t n) { | 156 inline uint32_t HostToNetwork32(uint32_t n) { |
141 uint32_t result; | 157 return htobe32(n); |
142 SetBE32(&result, n); | |
143 return result; | |
144 } | 158 } |
145 | 159 |
146 inline uint64_t HostToNetwork64(uint64_t n) { | 160 inline uint64_t HostToNetwork64(uint64_t n) { |
147 uint64_t result; | 161 return htobe64(n); |
148 SetBE64(&result, n); | |
149 return result; | |
150 } | 162 } |
151 | 163 |
152 inline uint16_t NetworkToHost16(uint16_t n) { | 164 inline uint16_t NetworkToHost16(uint16_t n) { |
153 return GetBE16(&n); | 165 return be16toh(n); |
154 } | 166 } |
155 | 167 |
156 inline uint32_t NetworkToHost32(uint32_t n) { | 168 inline uint32_t NetworkToHost32(uint32_t n) { |
157 return GetBE32(&n); | 169 return be32toh(n); |
158 } | 170 } |
159 | 171 |
160 inline uint64_t NetworkToHost64(uint64_t n) { | 172 inline uint64_t NetworkToHost64(uint64_t n) { |
161 return GetBE64(&n); | 173 return be64toh(n); |
162 } | 174 } |
163 | 175 |
164 } // namespace rtc | 176 } // namespace rtc |
165 | 177 |
166 #endif // WEBRTC_BASE_BYTEORDER_H_ | 178 #endif // WEBRTC_BASE_BYTEORDER_H_ |
OLD | NEW |