Bitstream Interpretation Library (BIL)  0.1
EndianConversion.hpp
Go to the documentation of this file.
1 
6 #pragma once
7 #ifndef BIL_ENDIANCONVERSION_HPP
8 #define BIL_ENDIANCONVERSION_HPP
9 
10 #include <boost/cstdint.hpp>
11 
12 
13 namespace bil {
14 
21  inline boost::uint16_t swapBigLittleEndian(const boost::uint16_t& x)
22  {
23  return (x >> 8) |
24  (x << 8);
25  }
26 
33  inline boost::uint32_t swapBigLittleEndian(const boost::uint32_t& x)
34  {
35  return (x >> 24) |
36  (x << 24) |
37  ((x >> 8) & 0x0000ff00) |
38  ((x << 8) & 0x00ff0000);
39  }
40 
48  inline boost::uint64_t swapBigLittleEndian(const boost::uint64_t& x)
49  {
50  return (x >> 56) |
51  (x << 56) |
52  ((x >> 40) & 0x000000000000ff00) |
53  ((x << 40) & 0x00ff000000000000) |
54  ((x >> 24) & 0x0000000000ff0000) |
55  ((x << 24) & 0x0000ff0000000000) |
56  ((x >> 8) & 0x00000000ff000000) |
57  ((x << 8) & 0x000000ff00000000);
58  }
59 
60 
67  template <typename type>
68  inline type swapBigEndian(const type& x)
69  {
70 #ifdef __LITTLE_ENDIAN__
71  return swapBigLittleEndian(x);
72 #elif defined(__BIG_ENDIAN__)
73  return x;
74 #else
75 #error Unsupported endianess: Define __LITTLE_ENDIAN__ or __BIG_ENDIAN__!
76 #endif
77  }
78 
85  template <typename type>
86  inline type swapLittleEndian(const type& x)
87  {
88 #ifdef __LITTLE_ENDIAN__
89  return x;
90 #elif defined(__BIG_ENDIAN__)
92 #else
93 #error Unsupported endianess: Define __LITTLE_ENDIAN__ or __BIG_ENDIAN__!
94 #endif
95  }
96 
97 }
98 
99 #endif