检测机器字节序的标准方法

时间:2014-10-23 12:54:44

标签: winapi c++11 endianness

所以我知道如何detect endianness programmatically

问题

是否有更多标准或本机(闭箱)方式检测字节序? WINAPI提供这样的解决方案吗?

1 个答案:

答案 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的值不是biglittle。< / p>

此档案:

https://github.com/HowardHinnant/hash_append/blob/master/hash_append.h

显示了此工具的一些示例用法。例如,有一个名为Hasher的东西可以请求提供给它的标量有以下三种形式之一:

  1. 本地端,无论发生什么。
  2. big endian。
  3. 小端。
  4. 根据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>{});
    }