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
最新推荐文章于 2024-06-25 17:21:01 发布
2万+

被折叠的 条评论
为什么被折叠?



