namespace {
#include <stdint-gcc.h>
inline uint16_t ByteSwap2(uint16_t inData) {
return (inData >> 8) | (inData << 8);
}
inline uint32_t ByteSwap4(uint32_t inData) {
return ((inData >> 24) & 0x000000ff)
| ((inData >> 8) & 0x0000ff00)
| ((inData << 8) & 0x00ff0000)
| ((inData << 24) & 0xff000000);
}
inline uint64_t ByteSwap8(uint64_t inData) {
return ((inData >> 56) & 0xff)
| ((inData >> 40) & 0xff00)
| ((inData >> 24) & 0xff0000)
| ((inData >> 8) & 0xff000000)
| ((inData << 8) & 0xff00000000)
| ((inData << 24) & 0xff0000000000)
| ((inData << 40) & 0xff000000000000)
| ((inData << 56) & 0xff00000000000000);
}
template<typename tFrom, typename tTo>
class TypeAliaser {
public:
TypeAliaser(tFrom inFromValue) : _asFromType(inFromValue) {}
tTo &Get() { return _asToType; }
private:
union {
tFrom _asFromType;
tTo _asToType;
};
};
template<typename T, unsigned long>
class ByteSwapper;
template<typename T>
class ByteSwapper<T, 2> {
public:
static T Swap(T inData) {
auto result = ByteSwap2(TypeAliaser<T, uint16_t>(inData).Get());
return TypeAliaser<uint16_t, T>(result).Get();
}
};
template<typename T>
class ByteSwapper<T, 4> {
public:
static T Swap(T inData) {
auto result = ByteSwap4(TypeAliaser<T, uint32_t>(inData).Get());
return TypeAliaser<uint32_t, T>(result).Get();
}
};
template<typename T>
class ByteSwapper<T, 8> {
public:
static T Swap(T inData) {
auto result = ByteSwap8(TypeAliaser<T, uint64_t>(inData).Get());
return TypeAliaser<uint64_t, T>(result).Get();
}
};
}
template<typename T>
inline T ByteSwap(T inData) {
return ByteSwapper<T, sizeof(T)>::Swap(inData);
}
ByteSwapper
最新推荐文章于 2022-06-19 11:38:22 发布