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 namespace base {
     24 
     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);
     28 }
     29 
     30 inline uint32 ByteSwap(uint32 x) {
     31   return ((x & 0x000000fful) << 24) | ((x & 0x0000ff00ul) << 8) |
     32       ((x & 0x00ff0000ul) >> 8) | ((x & 0xff000000ul) >> 24);
     33 }
     34 
     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.
     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 }
     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 }
     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.
     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 }
     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 }
     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.
     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 }
    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 }
    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