Line data Source code
1 : /*
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 :
18 : #if defined(WEBRTC_WIN)
19 : #include <stdlib.h>
20 : #endif
21 :
22 : #include "webrtc/base/basictypes.h"
23 :
24 : namespace rtc {
25 :
26 : // 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 :
30 0 : inline void Set8(void* memory, size_t offset, uint8_t v) {
31 0 : static_cast<uint8_t*>(memory)[offset] = v;
32 0 : }
33 :
34 0 : inline uint8_t Get8(const void* memory, size_t offset) {
35 0 : return static_cast<const uint8_t*>(memory)[offset];
36 : }
37 :
38 0 : inline void SetBE16(void* memory, uint16_t v) {
39 0 : Set8(memory, 0, static_cast<uint8_t>(v >> 8));
40 0 : Set8(memory, 1, static_cast<uint8_t>(v >> 0));
41 0 : }
42 :
43 0 : inline void SetBE32(void* memory, uint32_t v) {
44 0 : Set8(memory, 0, static_cast<uint8_t>(v >> 24));
45 0 : Set8(memory, 1, static_cast<uint8_t>(v >> 16));
46 0 : Set8(memory, 2, static_cast<uint8_t>(v >> 8));
47 0 : Set8(memory, 3, static_cast<uint8_t>(v >> 0));
48 0 : }
49 :
50 0 : inline void SetBE64(void* memory, uint64_t v) {
51 0 : Set8(memory, 0, static_cast<uint8_t>(v >> 56));
52 0 : Set8(memory, 1, static_cast<uint8_t>(v >> 48));
53 0 : Set8(memory, 2, static_cast<uint8_t>(v >> 40));
54 0 : Set8(memory, 3, static_cast<uint8_t>(v >> 32));
55 0 : Set8(memory, 4, static_cast<uint8_t>(v >> 24));
56 0 : Set8(memory, 5, static_cast<uint8_t>(v >> 16));
57 0 : Set8(memory, 6, static_cast<uint8_t>(v >> 8));
58 0 : Set8(memory, 7, static_cast<uint8_t>(v >> 0));
59 0 : }
60 :
61 0 : inline uint16_t GetBE16(const void* memory) {
62 0 : return static_cast<uint16_t>((Get8(memory, 0) << 8) | (Get8(memory, 1) << 0));
63 : }
64 :
65 0 : inline uint32_t GetBE32(const void* memory) {
66 0 : return (static_cast<uint32_t>(Get8(memory, 0)) << 24) |
67 0 : (static_cast<uint32_t>(Get8(memory, 1)) << 16) |
68 0 : (static_cast<uint32_t>(Get8(memory, 2)) << 8) |
69 0 : (static_cast<uint32_t>(Get8(memory, 3)) << 0);
70 : }
71 :
72 0 : inline uint64_t GetBE64(const void* memory) {
73 0 : return (static_cast<uint64_t>(Get8(memory, 0)) << 56) |
74 0 : (static_cast<uint64_t>(Get8(memory, 1)) << 48) |
75 0 : (static_cast<uint64_t>(Get8(memory, 2)) << 40) |
76 0 : (static_cast<uint64_t>(Get8(memory, 3)) << 32) |
77 0 : (static_cast<uint64_t>(Get8(memory, 4)) << 24) |
78 0 : (static_cast<uint64_t>(Get8(memory, 5)) << 16) |
79 0 : (static_cast<uint64_t>(Get8(memory, 6)) << 8) |
80 0 : (static_cast<uint64_t>(Get8(memory, 7)) << 0);
81 : }
82 :
83 : inline void SetLE16(void* memory, uint16_t v) {
84 : Set8(memory, 0, static_cast<uint8_t>(v >> 0));
85 : Set8(memory, 1, static_cast<uint8_t>(v >> 8));
86 : }
87 :
88 : inline void SetLE32(void* memory, uint32_t v) {
89 : Set8(memory, 0, static_cast<uint8_t>(v >> 0));
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 : }
94 :
95 : inline void SetLE64(void* memory, uint64_t v) {
96 : Set8(memory, 0, static_cast<uint8_t>(v >> 0));
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 : }
105 :
106 : inline uint16_t GetLE16(const void* memory) {
107 : return static_cast<uint16_t>((Get8(memory, 0) << 0) | (Get8(memory, 1) << 8));
108 : }
109 :
110 : inline uint32_t GetLE32(const void* memory) {
111 : return (static_cast<uint32_t>(Get8(memory, 0)) << 0) |
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 : }
116 :
117 : inline uint64_t GetLE64(const void* memory) {
118 : return (static_cast<uint64_t>(Get8(memory, 0)) << 0) |
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 : }
127 :
128 : // Check if the current host is big endian.
129 0 : inline bool IsHostBigEndian() {
130 : static const int number = 1;
131 0 : return 0 == *reinterpret_cast<const char*>(&number);
132 : }
133 :
134 0 : inline uint16_t HostToNetwork16(uint16_t n) {
135 : uint16_t result;
136 0 : SetBE16(&result, n);
137 0 : return result;
138 : }
139 :
140 0 : inline uint32_t HostToNetwork32(uint32_t n) {
141 : uint32_t result;
142 0 : SetBE32(&result, n);
143 0 : return result;
144 : }
145 :
146 0 : inline uint64_t HostToNetwork64(uint64_t n) {
147 : uint64_t result;
148 0 : SetBE64(&result, n);
149 0 : return result;
150 : }
151 :
152 0 : inline uint16_t NetworkToHost16(uint16_t n) {
153 0 : return GetBE16(&n);
154 : }
155 :
156 0 : inline uint32_t NetworkToHost32(uint32_t n) {
157 0 : return GetBE32(&n);
158 : }
159 :
160 0 : inline uint64_t NetworkToHost64(uint64_t n) {
161 0 : return GetBE64(&n);
162 : }
163 :
164 : } // namespace rtc
165 :
166 : #endif // WEBRTC_BASE_BYTEORDER_H_
|