blob: 704ed568b09e4483fb613ac8923636f6ac084b0d [file] [log] [blame]
wez@chromium.org31745282012-03-29 05:19:31 +09001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
isherman@chromium.org333d7fd2011-12-29 08:18:21 +09002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
wez@chromium.orgcd68c022012-04-06 13:32:28 +09005// 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.
isherman@chromium.org333d7fd2011-12-29 08:18:21 +090010
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
isherman@chromium.org333d7fd2011-12-29 08:18:21 +090023namespace base {
24
25// Returns a value with all bytes in |x| swapped, i.e. reverses the endianness.
wez@chromium.org31745282012-03-29 05:19:31 +090026inline uint16 ByteSwap(uint16 x) {
sergeyu@chromium.orgb9b28472013-12-23 13:02:49 +090027 return ((x & 0x00ff) << 8) | ((x & 0xff00) >> 8);
wez@chromium.org31745282012-03-29 05:19:31 +090028}
sergeyu@chromium.orgb9b28472013-12-23 13:02:49 +090029
wez@chromium.org31745282012-03-29 05:19:31 +090030inline uint32 ByteSwap(uint32 x) {
sergeyu@chromium.orgb9b28472013-12-23 13:02:49 +090031 return ((x & 0x000000fful) << 24) | ((x & 0x0000ff00ul) << 8) |
32 ((x & 0x00ff0000ul) >> 8) | ((x & 0xff000000ul) >> 24);
wez@chromium.org31745282012-03-29 05:19:31 +090033}
sergeyu@chromium.orgb9b28472013-12-23 13:02:49 +090034
isherman@chromium.org333d7fd2011-12-29 08:18:21 +090035inline uint64 ByteSwap(uint64 x) {
sergeyu@chromium.orgb9b28472013-12-23 13:02:49 +090036 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);
isherman@chromium.org333d7fd2011-12-29 08:18:21 +090044}
45
jwd@chromium.orgd0dab472012-04-17 00:29:27 +090046// Converts the bytes in |x| from host order (endianness) to little endian, and
47// returns the result.
48inline uint16 ByteSwapToLE16(uint16 x) {
49#if defined(ARCH_CPU_LITTLE_ENDIAN)
50 return x;
51#else
52 return ByteSwap(x);
53#endif
54}
55inline uint32 ByteSwapToLE32(uint32 x) {
56#if defined(ARCH_CPU_LITTLE_ENDIAN)
57 return x;
58#else
59 return ByteSwap(x);
60#endif
61}
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
isherman@chromium.org333d7fd2011-12-29 08:18:21 +090070// Converts the bytes in |x| from network to host order (endianness), and
71// returns the result.
wez@chromium.org31745282012-03-29 05:19:31 +090072inline uint16 NetToHost16(uint16 x) {
73#if defined(ARCH_CPU_LITTLE_ENDIAN)
74 return ByteSwap(x);
75#else
76 return x;
77#endif
78}
79inline uint32 NetToHost32(uint32 x) {
80#if defined(ARCH_CPU_LITTLE_ENDIAN)
81 return ByteSwap(x);
82#else
83 return x;
84#endif
85}
86inline uint64 NetToHost64(uint64 x) {
isherman@chromium.org333d7fd2011-12-29 08:18:21 +090087#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.
wez@chromium.org31745282012-03-29 05:19:31 +090096inline uint16 HostToNet16(uint16 x) {
97#if defined(ARCH_CPU_LITTLE_ENDIAN)
98 return ByteSwap(x);
99#else
100 return x;
101#endif
102}
103inline uint32 HostToNet32(uint32 x) {
104#if defined(ARCH_CPU_LITTLE_ENDIAN)
105 return ByteSwap(x);
106#else
107 return x;
108#endif
109}
110inline uint64 HostToNet64(uint64 x) {
isherman@chromium.org333d7fd2011-12-29 08:18:21 +0900111#if defined(ARCH_CPU_LITTLE_ENDIAN)
112 return ByteSwap(x);
113#else
114 return x;
115#endif
116}
117
118} // namespace base
119
isherman@chromium.org333d7fd2011-12-29 08:18:21 +0900120#endif // BASE_SYS_BYTEORDER_H_