Home | History | Annotate | Download | only in base
      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 // Include headers to provide byteswap for all platforms.
     24 #if defined(COMPILER_MSVC)
     25 #include <stdlib.h>
     26 #elif defined(OS_MACOSX)
     27 #include <libkern/OSByteOrder.h>
     28 #elif defined(OS_OPENBSD)
     29 #include <sys/endian.h>
     30 #else
     31 #include <byteswap.h>
     32 #endif
     33 
     34 
     35 namespace base {
     36 
     37 // Returns a value with all bytes in |x| swapped, i.e. reverses the endianness.
     38 inline uint16 ByteSwap(uint16 x) {
     39 #if defined(COMPILER_MSVC)
     40   return _byteswap_ushort(x);
     41 #elif defined(OS_MACOSX)
     42   return OSSwapInt16(x);
     43 #elif defined(OS_OPENBSD)
     44   return swap16(x);
     45 #else
     46   return bswap_16(x);
     47 #endif
     48 }
     49 inline uint32 ByteSwap(uint32 x) {
     50 #if defined(COMPILER_MSVC)
     51   return _byteswap_ulong(x);
     52 #elif defined(OS_MACOSX)
     53   return OSSwapInt32(x);
     54 #elif defined(OS_OPENBSD)
     55   return swap32(x);
     56 #else
     57   return bswap_32(x);
     58 #endif
     59 }
     60 inline uint64 ByteSwap(uint64 x) {
     61 #if defined(COMPILER_MSVC)
     62   return _byteswap_uint64(x);
     63 #elif defined(OS_MACOSX)
     64   return OSSwapInt64(x);
     65 #elif defined(OS_OPENBSD)
     66   return swap64(x);
     67 #else
     68   return bswap_64(x);
     69 #endif
     70 }
     71 
     72 // Converts the bytes in |x| from host order (endianness) to little endian, and
     73 // returns the result.
     74 inline uint16 ByteSwapToLE16(uint16 x) {
     75 #if defined(ARCH_CPU_LITTLE_ENDIAN)
     76   return x;
     77 #else
     78   return ByteSwap(x);
     79 #endif
     80 }
     81 inline uint32 ByteSwapToLE32(uint32 x) {
     82 #if defined(ARCH_CPU_LITTLE_ENDIAN)
     83   return x;
     84 #else
     85   return ByteSwap(x);
     86 #endif
     87 }
     88 inline uint64 ByteSwapToLE64(uint64 x) {
     89 #if defined(ARCH_CPU_LITTLE_ENDIAN)
     90   return x;
     91 #else
     92   return ByteSwap(x);
     93 #endif
     94 }
     95 
     96 // Converts the bytes in |x| from network to host order (endianness), and
     97 // returns the result.
     98 inline uint16 NetToHost16(uint16 x) {
     99 #if defined(ARCH_CPU_LITTLE_ENDIAN)
    100   return ByteSwap(x);
    101 #else
    102   return x;
    103 #endif
    104 }
    105 inline uint32 NetToHost32(uint32 x) {
    106 #if defined(ARCH_CPU_LITTLE_ENDIAN)
    107   return ByteSwap(x);
    108 #else
    109   return x;
    110 #endif
    111 }
    112 inline uint64 NetToHost64(uint64 x) {
    113 #if defined(ARCH_CPU_LITTLE_ENDIAN)
    114   return ByteSwap(x);
    115 #else
    116   return x;
    117 #endif
    118 }
    119 
    120 // Converts the bytes in |x| from host to network order (endianness), and
    121 // returns the result.
    122 inline uint16 HostToNet16(uint16 x) {
    123 #if defined(ARCH_CPU_LITTLE_ENDIAN)
    124   return ByteSwap(x);
    125 #else
    126   return x;
    127 #endif
    128 }
    129 inline uint32 HostToNet32(uint32 x) {
    130 #if defined(ARCH_CPU_LITTLE_ENDIAN)
    131   return ByteSwap(x);
    132 #else
    133   return x;
    134 #endif
    135 }
    136 inline uint64 HostToNet64(uint64 x) {
    137 #if defined(ARCH_CPU_LITTLE_ENDIAN)
    138   return ByteSwap(x);
    139 #else
    140   return x;
    141 #endif
    142 }
    143 
    144 }  // namespace base
    145 
    146 
    147 #endif  // BASE_SYS_BYTEORDER_H_
    148