答案 0 :(得分:3)
没有标准的C ++提供的功能来检测字节序。我和Beman Dawes都在努力纠正这个问题。然而,在这样的努力中取得成功既快要慢,又远非确定。
我一直在尝试以下标题:
https://github.com/HowardHinnant/hash_append/blob/master/endian.h
如图所示不能移植到Windows,但当然可以通过std :: lib实现者轻松移植到Windows。机制非常简单:
// endian provides answers to the following questions:
// 1. Is this system big or little endian?
// 2. Is the "desired endian" of some class or function the same as the
// native endian?
enum class endian
{
native = // unspecified,
little = // unspecified,
big = // unspecified
};
如果您使用的是小端机器,请endian::native == endian::little
。
如果您使用的是大端机器,请endian::native == endian::big
。
如果您使用的是混合端机(我很久没见过),那么endian::native
的值不是big
或little
。< / p>
此档案:
https://github.com/HowardHinnant/hash_append/blob/master/hash_append.h
显示了此工具的一些示例用法。例如,有一个名为Hasher
的东西可以请求提供给它的标量有以下三种形式之一:
根据Hasher
的意愿和平台的原生端,有一个小的实用程序可以反转(或不反转)标量的字节:
template <class T>
constexpr
inline
void
reverse_bytes(T& t)
{
unsigned char* bytes = static_cast<unsigned char*>(std::memmove(std::addressof(t), std::addressof(t), sizeof(T)));
for (unsigned i = 0; i < sizeof(T)/2; ++i)
std::swap(bytes[i], bytes[sizeof(T)-1-i]);
}
template <class T>
constexpr
inline
void
maybe_reverse_bytes(T& t, std::true_type)
{
}
template <class T>
constexpr
inline
void
maybe_reverse_bytes(T& t, std::false_type)
{
reverse_bytes(t);
}
template <class T, class Hasher>
constexpr
inline
void
maybe_reverse_bytes(T& t, Hasher&)
{
maybe_reverse_bytes(t, std::integral_constant<bool,
Hasher::endian == endian::native>{});
}