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.
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
11 #ifndef BASE_SYS_BYTEORDER_H_
12 #define BASE_SYS_BYTEORDER_H_
14 #include "base/basictypes.h"
15 #include "build/build_config.h"
20 #include <arpa/inet.h>
25 // Returns a value with all bytes in |x| swapped, i.e. reverses the endianness.
26 inline uint16
ByteSwap(uint16 x
) {
27 return ((x
& 0x00ff) << 8) | ((x
& 0xff00) >> 8);
30 inline uint32
ByteSwap(uint32 x
) {
31 return ((x
& 0x000000fful
) << 24) | ((x
& 0x0000ff00ul
) << 8) |
32 ((x
& 0x00ff0000ul
) >> 8) | ((x
& 0xff000000ul
) >> 24);
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);
46 // Converts the bytes in |x| from host order (endianness) to little endian, and
47 // returns the result.
48 inline uint16
ByteSwapToLE16(uint16 x
) {
49 #if defined(ARCH_CPU_LITTLE_ENDIAN)
55 inline uint32
ByteSwapToLE32(uint32 x
) {
56 #if defined(ARCH_CPU_LITTLE_ENDIAN)
62 inline uint64
ByteSwapToLE64(uint64 x
) {
63 #if defined(ARCH_CPU_LITTLE_ENDIAN)
70 // Converts the bytes in |x| from network to host order (endianness), and
71 // returns the result.
72 inline uint16
NetToHost16(uint16 x
) {
73 #if defined(ARCH_CPU_LITTLE_ENDIAN)
79 inline uint32
NetToHost32(uint32 x
) {
80 #if defined(ARCH_CPU_LITTLE_ENDIAN)
86 inline uint64
NetToHost64(uint64 x
) {
87 #if defined(ARCH_CPU_LITTLE_ENDIAN)
94 // Converts the bytes in |x| from host to network order (endianness), and
95 // returns the result.
96 inline uint16
HostToNet16(uint16 x
) {
97 #if defined(ARCH_CPU_LITTLE_ENDIAN)
103 inline uint32
HostToNet32(uint32 x
) {
104 #if defined(ARCH_CPU_LITTLE_ENDIAN)
110 inline uint64
HostToNet64(uint64 x
) {
111 #if defined(ARCH_CPU_LITTLE_ENDIAN)
120 #endif // BASE_SYS_BYTEORDER_H_