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 inline void Set8(void* memory, size_t offset, uint8_t v) { 31 static_cast<uint8_t*>(memory)[offset] = v; 32 } 33 34 inline uint8_t Get8(const void* memory, size_t offset) { 35 return static_cast<const uint8_t*>(memory)[offset]; 36 } 37 38 inline void SetBE16(void* memory, uint16_t v) { 39 Set8(memory, 0, static_cast<uint8_t>(v >> 8)); 40 Set8(memory, 1, static_cast<uint8_t>(v >> 0)); 41 } 42 43 inline void SetBE32(void* memory, uint32_t v) { 44 Set8(memory, 0, static_cast<uint8_t>(v >> 24)); 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 } 49 50 inline void SetBE64(void* memory, uint64_t v) { 51 Set8(memory, 0, static_cast<uint8_t>(v >> 56)); 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 } 60 61 inline uint16_t GetBE16(const void* memory) { 62 return static_cast<uint16_t>((Get8(memory, 0) << 8) | (Get8(memory, 1) << 0)); 63 } 64 65 inline uint32_t GetBE32(const void* memory) { 66 return (static_cast<uint32_t>(Get8(memory, 0)) << 24) | 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 } 71 72 inline uint64_t GetBE64(const void* memory) { 73 return (static_cast<uint64_t>(Get8(memory, 0)) << 56) | 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 } 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 inline bool IsHostBigEndian() { 130 static const int number = 1; 131 return 0 == *reinterpret_cast<const char*>(&number); 132 } 133 134 inline uint16_t HostToNetwork16(uint16_t n) { 135 uint16_t result; 136 SetBE16(&result, n); 137 return result; 138 } 139 140 inline uint32_t HostToNetwork32(uint32_t n) { 141 uint32_t result; 142 SetBE32(&result, n); 143 return result; 144 } 145 146 inline uint64_t HostToNetwork64(uint64_t n) { 147 uint64_t result; 148 SetBE64(&result, n); 149 return result; 150 } 151 152 inline uint16_t NetworkToHost16(uint16_t n) { 153 return GetBE16(&n); 154 } 155 156 inline uint32_t NetworkToHost32(uint32_t n) { 157 return GetBE32(&n); 158 } 159 160 inline uint64_t NetworkToHost64(uint64_t n) { 161 return GetBE64(&n); 162 } 163 164 } // namespace rtc 165 166 #endif // WEBRTC_BASE_BYTEORDER_H_ 167