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 24namespace 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 30inline void Set8(void* memory, size_t offset, uint8 v) { 31 static_cast<uint8*>(memory)[offset] = v; 32} 33 34inline uint8 Get8(const void* memory, size_t offset) { 35 return static_cast<const uint8*>(memory)[offset]; 36} 37 38inline void SetBE16(void* memory, uint16 v) { 39 Set8(memory, 0, static_cast<uint8>(v >> 8)); 40 Set8(memory, 1, static_cast<uint8>(v >> 0)); 41} 42 43inline void SetBE32(void* memory, uint32 v) { 44 Set8(memory, 0, static_cast<uint8>(v >> 24)); 45 Set8(memory, 1, static_cast<uint8>(v >> 16)); 46 Set8(memory, 2, static_cast<uint8>(v >> 8)); 47 Set8(memory, 3, static_cast<uint8>(v >> 0)); 48} 49 50inline void SetBE64(void* memory, uint64 v) { 51 Set8(memory, 0, static_cast<uint8>(v >> 56)); 52 Set8(memory, 1, static_cast<uint8>(v >> 48)); 53 Set8(memory, 2, static_cast<uint8>(v >> 40)); 54 Set8(memory, 3, static_cast<uint8>(v >> 32)); 55 Set8(memory, 4, static_cast<uint8>(v >> 24)); 56 Set8(memory, 5, static_cast<uint8>(v >> 16)); 57 Set8(memory, 6, static_cast<uint8>(v >> 8)); 58 Set8(memory, 7, static_cast<uint8>(v >> 0)); 59} 60 61inline uint16 GetBE16(const void* memory) { 62 return static_cast<uint16>((Get8(memory, 0) << 8) | 63 (Get8(memory, 1) << 0)); 64} 65 66inline uint32 GetBE32(const void* memory) { 67 return (static_cast<uint32>(Get8(memory, 0)) << 24) | 68 (static_cast<uint32>(Get8(memory, 1)) << 16) | 69 (static_cast<uint32>(Get8(memory, 2)) << 8) | 70 (static_cast<uint32>(Get8(memory, 3)) << 0); 71} 72 73inline uint64 GetBE64(const void* memory) { 74 return (static_cast<uint64>(Get8(memory, 0)) << 56) | 75 (static_cast<uint64>(Get8(memory, 1)) << 48) | 76 (static_cast<uint64>(Get8(memory, 2)) << 40) | 77 (static_cast<uint64>(Get8(memory, 3)) << 32) | 78 (static_cast<uint64>(Get8(memory, 4)) << 24) | 79 (static_cast<uint64>(Get8(memory, 5)) << 16) | 80 (static_cast<uint64>(Get8(memory, 6)) << 8) | 81 (static_cast<uint64>(Get8(memory, 7)) << 0); 82} 83 84inline void SetLE16(void* memory, uint16 v) { 85 Set8(memory, 0, static_cast<uint8>(v >> 0)); 86 Set8(memory, 1, static_cast<uint8>(v >> 8)); 87} 88 89inline void SetLE32(void* memory, uint32 v) { 90 Set8(memory, 0, static_cast<uint8>(v >> 0)); 91 Set8(memory, 1, static_cast<uint8>(v >> 8)); 92 Set8(memory, 2, static_cast<uint8>(v >> 16)); 93 Set8(memory, 3, static_cast<uint8>(v >> 24)); 94} 95 96inline void SetLE64(void* memory, uint64 v) { 97 Set8(memory, 0, static_cast<uint8>(v >> 0)); 98 Set8(memory, 1, static_cast<uint8>(v >> 8)); 99 Set8(memory, 2, static_cast<uint8>(v >> 16)); 100 Set8(memory, 3, static_cast<uint8>(v >> 24)); 101 Set8(memory, 4, static_cast<uint8>(v >> 32)); 102 Set8(memory, 5, static_cast<uint8>(v >> 40)); 103 Set8(memory, 6, static_cast<uint8>(v >> 48)); 104 Set8(memory, 7, static_cast<uint8>(v >> 56)); 105} 106 107inline uint16 GetLE16(const void* memory) { 108 return static_cast<uint16>((Get8(memory, 0) << 0) | 109 (Get8(memory, 1) << 8)); 110} 111 112inline uint32 GetLE32(const void* memory) { 113 return (static_cast<uint32>(Get8(memory, 0)) << 0) | 114 (static_cast<uint32>(Get8(memory, 1)) << 8) | 115 (static_cast<uint32>(Get8(memory, 2)) << 16) | 116 (static_cast<uint32>(Get8(memory, 3)) << 24); 117} 118 119inline uint64 GetLE64(const void* memory) { 120 return (static_cast<uint64>(Get8(memory, 0)) << 0) | 121 (static_cast<uint64>(Get8(memory, 1)) << 8) | 122 (static_cast<uint64>(Get8(memory, 2)) << 16) | 123 (static_cast<uint64>(Get8(memory, 3)) << 24) | 124 (static_cast<uint64>(Get8(memory, 4)) << 32) | 125 (static_cast<uint64>(Get8(memory, 5)) << 40) | 126 (static_cast<uint64>(Get8(memory, 6)) << 48) | 127 (static_cast<uint64>(Get8(memory, 7)) << 56); 128} 129 130// Check if the current host is big endian. 131inline bool IsHostBigEndian() { 132 static const int number = 1; 133 return 0 == *reinterpret_cast<const char*>(&number); 134} 135 136inline uint16 HostToNetwork16(uint16 n) { 137 uint16 result; 138 SetBE16(&result, n); 139 return result; 140} 141 142inline uint32 HostToNetwork32(uint32 n) { 143 uint32 result; 144 SetBE32(&result, n); 145 return result; 146} 147 148inline uint64 HostToNetwork64(uint64 n) { 149 uint64 result; 150 SetBE64(&result, n); 151 return result; 152} 153 154inline uint16 NetworkToHost16(uint16 n) { 155 return GetBE16(&n); 156} 157 158inline uint32 NetworkToHost32(uint32 n) { 159 return GetBE32(&n); 160} 161 162inline uint64 NetworkToHost64(uint64 n) { 163 return GetBE64(&n); 164} 165 166} // namespace rtc 167 168#endif // WEBRTC_BASE_BYTEORDER_H_ 169