• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)26 inline uint16 ByteSwap(uint16 x) {
27   return ((x & 0x00ff) << 8) | ((x & 0xff00) >> 8);
28 }
29 
ByteSwap(uint32 x)30 inline uint32 ByteSwap(uint32 x) {
31   return ((x & 0x000000fful) << 24) | ((x & 0x0000ff00ul) << 8) |
32       ((x & 0x00ff0000ul) >> 8) | ((x & 0xff000000ul) >> 24);
33 }
34 
ByteSwap(uint64 x)35 inline 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)48 inline 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)55 inline 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)62 inline 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)72 inline 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)79 inline 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)86 inline 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)96 inline 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)103 inline 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)110 inline 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