1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // This header defines cross-platform ByteSwap() implementations for 16, 32 and 6 // 64-bit values, and NetToHostXX() / HostToNextXX() functions equivalent to 7 // the traditional ntohX() and htonX() functions. 8 // Use the functions defined here rather than using the platform-specific 9 // functions directly. 10 11 #ifndef BASE_SYS_BYTEORDER_H_ 12 #define BASE_SYS_BYTEORDER_H_ 13 14 #include "base/basictypes.h" 15 #include "build/build_config.h" 16 17 #if defined(OS_WIN) 18 #include <winsock2.h> 19 #else 20 #include <arpa/inet.h> 21 #endif 22 23 namespace base { 24 25 // Returns a value with all bytes in |x| swapped, i.e. reverses the endianness. ByteSwap(uint16 x)26inline uint16 ByteSwap(uint16 x) { 27 return ((x & 0x00ff) << 8) | ((x & 0xff00) >> 8); 28 } 29 ByteSwap(uint32 x)30inline uint32 ByteSwap(uint32 x) { 31 return ((x & 0x000000fful) << 24) | ((x & 0x0000ff00ul) << 8) | 32 ((x & 0x00ff0000ul) >> 8) | ((x & 0xff000000ul) >> 24); 33 } 34 ByteSwap(uint64 x)35inline uint64 ByteSwap(uint64 x) { 36 return ((x & 0x00000000000000ffull) << 56) | 37 ((x & 0x000000000000ff00ull) << 40) | 38 ((x & 0x0000000000ff0000ull) << 24) | 39 ((x & 0x00000000ff000000ull) << 8) | 40 ((x & 0x000000ff00000000ull) >> 8) | 41 ((x & 0x0000ff0000000000ull) >> 24) | 42 ((x & 0x00ff000000000000ull) >> 40) | 43 ((x & 0xff00000000000000ull) >> 56); 44 } 45 46 // Converts the bytes in |x| from host order (endianness) to little endian, and 47 // returns the result. ByteSwapToLE16(uint16 x)48inline uint16 ByteSwapToLE16(uint16 x) { 49 #if defined(ARCH_CPU_LITTLE_ENDIAN) 50 return x; 51 #else 52 return ByteSwap(x); 53 #endif 54 } ByteSwapToLE32(uint32 x)55inline uint32 ByteSwapToLE32(uint32 x) { 56 #if defined(ARCH_CPU_LITTLE_ENDIAN) 57 return x; 58 #else 59 return ByteSwap(x); 60 #endif 61 } ByteSwapToLE64(uint64 x)62inline uint64 ByteSwapToLE64(uint64 x) { 63 #if defined(ARCH_CPU_LITTLE_ENDIAN) 64 return x; 65 #else 66 return ByteSwap(x); 67 #endif 68 } 69 70 // Converts the bytes in |x| from network to host order (endianness), and 71 // returns the result. NetToHost16(uint16 x)72inline uint16 NetToHost16(uint16 x) { 73 #if defined(ARCH_CPU_LITTLE_ENDIAN) 74 return ByteSwap(x); 75 #else 76 return x; 77 #endif 78 } NetToHost32(uint32 x)79inline uint32 NetToHost32(uint32 x) { 80 #if defined(ARCH_CPU_LITTLE_ENDIAN) 81 return ByteSwap(x); 82 #else 83 return x; 84 #endif 85 } NetToHost64(uint64 x)86inline uint64 NetToHost64(uint64 x) { 87 #if defined(ARCH_CPU_LITTLE_ENDIAN) 88 return ByteSwap(x); 89 #else 90 return x; 91 #endif 92 } 93 94 // Converts the bytes in |x| from host to network order (endianness), and 95 // returns the result. HostToNet16(uint16 x)96inline uint16 HostToNet16(uint16 x) { 97 #if defined(ARCH_CPU_LITTLE_ENDIAN) 98 return ByteSwap(x); 99 #else 100 return x; 101 #endif 102 } HostToNet32(uint32 x)103inline uint32 HostToNet32(uint32 x) { 104 #if defined(ARCH_CPU_LITTLE_ENDIAN) 105 return ByteSwap(x); 106 #else 107 return x; 108 #endif 109 } HostToNet64(uint64 x)110inline uint64 HostToNet64(uint64 x) { 111 #if defined(ARCH_CPU_LITTLE_ENDIAN) 112 return ByteSwap(x); 113 #else 114 return x; 115 #endif 116 } 117 118 } // namespace base 119 120 #endif // BASE_SYS_BYTEORDER_H_ 121